您的位置:首页 > 编程语言 > C语言/C++

C++多线程(POSIX)

2015-07-14 10:26 351 查看
#include<iostream>
#include<pthread.h>
#include<ctime>
#include<windows.h>

using namespace std;

const int Num=10;
int tally = 0;//glable
pthread_mutex_t mutex;
pthread_cond_t cond;
void* ThreadProc(void* t)
{

Sleep(50);
pthread_mutex_lock(&mutex);//上锁
tally += 1;
int p=*(int*)t;
Sleep(10);
// printf("线程编号为%d  全局资源值为%d\n", p, tally);
cout<<"线程编号为:"<<p<<","<<"全局资源值为:"<<tally<<'\n';
pthread_cond_signal(&cond);  //发送信号
pthread_mutex_unlock(&mutex);//解锁
int s=p+10;
pthread_exit((void *)s);
}

int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
for(int j=0;j<20;j++)
{
tally=0;
pthread_t statues[Num];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
int index[Num];
pthread_mutex_init (&mutex, NULL);        //对锁初始化,必须的
pthread_cond_init(&cond,NULL);    //初始化信号量
for(int i=0;i<Num;i++)
{
index[i]=i;
int rec=pthread_create(&statues[i],&attr,ThreadProc, (void*)& index[i]); //create success,return 0
pthread_cond_wait(&cond,&mutex); // 等待接受信号
if(rec != 0)
{
throw "thread create failed";
exit(-1);
}
}
pthread_attr_destroy(&attr);
void *s;
for(int i=0;i<Num;i++)
{
int ret=pthread_join(statues[i], &s);
if(ret!=0)
{
throw "thread create failed";
exit(-1);
}
cout<<(int)s<<endl;
}
cout<<tally<<endl;
}

pthread_exit(NULL); //main 通过pthread_exit()退出时,其它线程仍会执行。
return 0;
}




线程执行的顺序是混乱无序的,出现1号线程先于0号线程执行的原因是:在0号线程停留在Sleep(50)的时候,1号线程创建并抢先执行完毕。

将pthread_mutex_lock(&mutex)上锁放在Sleep之前就可以让线程号从0~9了,但这样子就失去多线程的价值了

总结:

1,用互斥锁来完成线程之间的互斥操作,对临街资源的操作可以用原子操作或者互斥锁来完成。

2,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。

自己理解学习的记录,水平渣,可能会有很多错误~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: