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 全局资源值为%dn", p, tally);
22 cout<<"线程编号为:"<<p<<","<<"全局资源值为:"<<tally<<'n';
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,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。
自己理解学习的记录,水平渣,可能会有很多错误~
原文链接: https://www.cnblogs.com/fkissx/p/4644759.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/219108
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!