C++多线程(POSIX)

 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\n", 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,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。


自己理解学习的记录,水平渣,可能会有很多错误~

posted @ 2015-07-14 10:26  fkissx  阅读(1817)  评论(0编辑  收藏  举报