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,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。
自己理解学习的记录,水平渣,可能会有很多错误~
相关文章推荐
- 菜鸟学习-C语言函数参数传递详解-结构体与数组
- C语言中Static和Const关键字的的作用 -- 转
- GCC+宏及C++
- 1.将一个有序数组反转
- C++ 整型提升的规则
- C++判断矩形相交的方法
- MFC技术内幕系列之(五)---MFC文档序列化内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(三)----MFC执行期类型识别与动态创建技术内幕
- C++下用什么矩阵运算库比较好
- C++的global data的位置 及PE 文件中的section的内容
- MFC技术内幕系列之(一)---MFC应用程序“生死因果”内幕
- MFC的工具条和状态栏
- Jni 简单实战 获取c++返回值
- C++ 使用delete删除指针(1
- C++引用参数和引用返回值
- C++ 使用delete删除指针(2
- MFC的对话框类CDialog
- C++学习笔记 模板 包含编译模式 分别编译模式
- C++ - 将模板的声明和定义放置在同一个头文件里