zoukankan      html  css  js  c++  java
  • 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
    ", 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,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。


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

  • 相关阅读:
    bzoj 1977
    bzoj 3389
    bzoj 1064
    codeforces 424D
    codeforces 425C
    codeforces 425D
    codeforces 427E
    codeforces 425E
    codeforces 429D
    codeforces 429E
  • 原文地址:https://www.cnblogs.com/fkissx/p/4644759.html
Copyright © 2011-2022 走看看