1 #include<iostream> 2 #include<pthread.h> 3 #include<ctime> 4 #include<windows.h> 5 6 using namespace std; 7 8 9 const int Num=10; 10 int tally = 0;//glable 11 pthread_mutex_t mutex; 12 pthread_cond_t cond; 13 void* ThreadProc(void* t) 14 { 15 16 Sleep(50); 17 pthread_mutex_lock(&mutex);//上锁 18 tally += 1; 19 int p=*(int*)t; 20 Sleep(10); 21 // printf("线程编号为%d 全局资源值为%d ", p, tally); 22 cout<<"线程编号为:"<<p<<","<<"全局资源值为:"<<tally<<' '; 23 pthread_cond_signal(&cond); //发送信号 24 pthread_mutex_unlock(&mutex);//解锁 25 int s=p+10; 26 pthread_exit((void *)s); 27 } 28 29 int main(int argc, char* argv[]) 30 { 31 ios::sync_with_stdio(false); 32 for(int j=0;j<20;j++) 33 { 34 tally=0; 35 pthread_t statues[Num]; 36 pthread_attr_t attr; 37 pthread_attr_init(&attr); 38 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); 39 int index[Num]; 40 pthread_mutex_init (&mutex, NULL); //对锁初始化,必须的 41 pthread_cond_init(&cond,NULL); //初始化信号量 42 for(int i=0;i<Num;i++) 43 { 44 index[i]=i; 45 int rec=pthread_create(&statues[i],&attr,ThreadProc, (void*)& index[i]); //create success,return 0 46 pthread_cond_wait(&cond,&mutex); // 等待接受信号 47 if(rec != 0) 48 { 49 throw "thread create failed"; 50 exit(-1); 51 } 52 } 53 pthread_attr_destroy(&attr); 54 void *s; 55 for(int i=0;i<Num;i++) 56 { 57 int ret=pthread_join(statues[i], &s); 58 if(ret!=0) 59 { 60 throw "thread create failed"; 61 exit(-1); 62 } 63 cout<<(int)s<<endl; 64 } 65 cout<<tally<<endl; 66 } 67 68 pthread_exit(NULL); //main 通过pthread_exit()退出时,其它线程仍会执行。 69 return 0; 70 }
线程执行的顺序是混乱无序的,出现1号线程先于0号线程执行的原因是:在0号线程停留在Sleep(50)的时候,1号线程创建并抢先执行完毕。
将pthread_mutex_lock(&mutex)上锁放在Sleep之前就可以让线程号从0~9了,但这样子就失去多线程的价值了
总结:
1,用互斥锁来完成线程之间的互斥操作,对临街资源的操作可以用原子操作或者互斥锁来完成。
2,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。
自己理解学习的记录,水平渣,可能会有很多错误~