这个最简单的多线程例子,为什么结果不一样呢?在线等!急

时间:2021-08-04 10:30:03
就是网络上到处都有的那个递加的多线程例子
为什么每次运行后显示的结果都不一样呢? 
这个原因应该是在哪个地方呢?
希望你一针见血。谢谢了。
#include<stdio.h>
#include<pthread.h>
#include<sys/time.h>
#include<string.h>
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0,i;
void thread1()
{
  printf("thread1:I'm thread 1\n");
  for(i=0;i<MAX;i++)
  {
     printf("thread1:number=%d\n",number);
     pthread_mutex_lock(&mut);
              number++;
     pthread_mutex_unlock(&mut);
     sleep(2);
   }
   printf("thread1:主函数在等我完成任务吗?\n");
   pthread_exit(NULL);
}
void *thread2()
{
    printf("thread2:I'm thread2\n");
    for(i=0;i<MAX;i++)
    {
          printf("thread2:number=%d\n",number);
          pthread_mutex_lock(&mut);
               number++;
          pthread_mutex_unlock(&mut);
          sleep(3);
     }
     printf("thread2:主函数在等我完成任务吗?\n");
     pthread_exit(NULL);
}
void thread_create(void)
{
    int temp;
    memset(&thread,0,sizeof(thread));       //comment1
    /*创建线程*/
    if((temp=pthread_create(&thread[0],NULL,thread1,NULL))!=0)  //comment2
           printf("线程1创建失败!\n");
    else
        printf("线程1被创建!\n");
 if((temp=pthread_create(&thread[1],NULL,thread2,NULL))!=0)   //comment3
        printf("线程2创建失败!\n");
    else
        printf("线程2被创建!\n");
}
void thread_wait(void)
{
      /*等待线程结束*/
      if(thread[0]!=0)
       {                             //comment4
          pthread_join(thread[0],NULL);
          printf("线程1已经结束!\n");
        }
      if(thread[1]!=0)
       {                              //comment5
         pthread_join(thread[1],NULL);
         printf("线程2已经结束!\n");
        }
}
int main()
{
          /*用默认属性初始化互斥锁*/
 pthread_mutex_init(&mut,NULL);
          printf("我是主函数哦,我正在创建线程\n");
          thread_create();
          printf("我是主函数哦,我正在等待线程完成任务!\n");
          thread_wait();
          return 0;
}

在线等。

15 个解决方案

#1


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!


第一次结果

#2


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!



第2个结果

#3


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!



第3次结果。

#4


线程的执行是独立的

#5



.学知网是个有5000G学习资料的下载网站,注册后可免费下载以下资料:
.[路径]电脑网络-计算机源码-VC源代码-vc-EasyFTP-RES
.[地址]http://www.stuknow.com/dirlist/10002/cb4a155be4c47617654a9183d5c6a013.htm?popid=chenhj_wo

#6


printf("thread2:number=%d\n",number); 

放到互斥锁里面

#7


另外你看的什么书呀?

#8


要是我要让它们同步的话
          /*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL); 
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。

#9


看得一本很老的,02年的那个LINUX应用开发基础,上面用的初始化互斥锁是
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0) 
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。 这个最简单的多线程例子,为什么结果不一样呢?在线等!急

#10


pthread_mutex_t mutex;

pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);

pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);

pthread_mutex_init(&mutex,&attr);

pthread_mutex_destroy(&attr);

#11


多线程的程序,在执行的过程要做线程切换,所以执行每次执行的结果是不一样的;
只要保证需要的数据正确就可以

#12


直接man下,有不同系统下,头文件和函数都不太相同的。

但是pthread_mutex_init是posix,应该Unix和linux都会支持的。

这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。

#13


pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr); 
这样设置属性以后都不是同步的吗?

#14


顺便问下,2个线程,线程1不停的读取文件,线程2每过100毫秒输出一个当时线程1读取的字符,这个怎么实现呢? 2个线程如何联系起来?

#15


这个一般弄成个队列,就跟生产者和消费者一样。

#1


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread2:number=5
thread1:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!


第一次结果

#2


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=5
thread1:number=7
thread2:number=8
thread1:number=9
thread1:number=10
thread2:主函数在等我完成任务吗?
thread1:主函数在等我完成任务吗?
线程1已经结束!
线程2已经结束!



第2个结果

#3


我是主函数哦,我正在创建线程
thread1:I'm thread 1
thread1:number=0
线程1被创建!
thread2:I'm thread2
thread2:number=1
线程2被创建!
我是主函数哦,我正在等待线程完成任务!
thread1:number=2
thread2:number=3
thread1:number=4
thread1:number=5
thread2:number=6
thread1:number=7
thread2:number=8
thread1:number=9
thread2:number=10
thread1:主函数在等我完成任务吗?
线程1已经结束!
thread2:主函数在等我完成任务吗?
线程2已经结束!



第3次结果。

#4


线程的执行是独立的

#5



.学知网是个有5000G学习资料的下载网站,注册后可免费下载以下资料:
.[路径]电脑网络-计算机源码-VC源代码-vc-EasyFTP-RES
.[地址]http://www.stuknow.com/dirlist/10002/cb4a155be4c47617654a9183d5c6a013.htm?popid=chenhj_wo

#6


printf("thread2:number=%d\n",number); 

放到互斥锁里面

#7


另外你看的什么书呀?

#8


要是我要让它们同步的话
          /*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL); 
改成
pthread_mutexattr_init(这个?)来初始化
这个括号里面应该写什么呢?
看网上说的也没看懂它参数到底该填什么,连该填几个参数我都没找到
只看见它说PTHREAD_PROCESS_PRIVATE用于进程间线程同步PTHREAD_PROCESS_SHARED用于同一进程间线程同步,但是没看见说怎么写。
pthread_mutexattr_init(这个?)这个里面填2个参数就不对,填一个参数才对,我就填了一个(&mut),也不知道是不是这样。默认就同步了?PTHREAD_PROCESS_PRIVATE这个都不知道填哪里。

#9


看得一本很老的,02年的那个LINUX应用开发基础,上面用的初始化互斥锁是
#include<synch.h>或者<thread.h>
mutex_init(&mut,UNYNC_PROCESS,0) 
我这个上面都找不到那2个头文件。
公司还有就2本资料讲多线程,另外一本是翻译的美国的好像,老大说我看不懂,让我别看。 这个最简单的多线程例子,为什么结果不一样呢?在线等!急

#10


pthread_mutex_t mutex;

pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);

pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);

pthread_mutex_init(&mutex,&attr);

pthread_mutex_destroy(&attr);

#11


多线程的程序,在执行的过程要做线程切换,所以执行每次执行的结果是不一样的;
只要保证需要的数据正确就可以

#12


直接man下,有不同系统下,头文件和函数都不太相同的。

但是pthread_mutex_init是posix,应该Unix和linux都会支持的。

这个互斥锁没办法保持同步,只不过保证计数器依次加1,没办法,然依次交替各执行一次。

#13


pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex,&attr); 
这样设置属性以后都不是同步的吗?

#14


顺便问下,2个线程,线程1不停的读取文件,线程2每过100毫秒输出一个当时线程1读取的字符,这个怎么实现呢? 2个线程如何联系起来?

#15


这个一般弄成个队列,就跟生产者和消费者一样。