C++多线程(POSIX)
#include<iostream>
#include<pthread.h>
#include<ctime>
#include<windows.h> using namespace std; const int Num=;
int tally = ;//glable
pthread_mutex_t mutex;
pthread_cond_t cond;
void* ThreadProc(void* t)
{ Sleep();
pthread_mutex_lock(&mutex);//上锁
tally += ;
int p=*(int*)t;
Sleep();
// printf("线程编号为%d 全局资源值为%d\n", p, tally);
cout<<"线程编号为:"<<p<<","<<"全局资源值为:"<<tally<<'\n';
pthread_cond_signal(&cond); //发送信号
pthread_mutex_unlock(&mutex);//解锁
int s=p+;
pthread_exit((void *)s);
} int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
for(int j=;j<;j++)
{
tally=;
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=;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 != )
{
throw "thread create failed";
exit(-);
}
}
pthread_attr_destroy(&attr);
void *s;
for(int i=;i<Num;i++)
{
int ret=pthread_join(statues[i], &s);
if(ret!=)
{
throw "thread create failed";
exit(-);
}
cout<<(int)s<<endl;
}
cout<<tally<<endl;
} pthread_exit(NULL); //main 通过pthread_exit()退出时,其它线程仍会执行。
return ;
}

线程执行的顺序是混乱无序的,出现1号线程先于0号线程执行的原因是:在0号线程停留在Sleep(50)的时候,1号线程创建并抢先执行完毕。
将pthread_mutex_lock(&mutex)上锁放在Sleep之前就可以让线程号从0~9了,但这样子就失去多线程的价值了
总结:
1,用互斥锁来完成线程之间的互斥操作,对临街资源的操作可以用原子操作或者互斥锁来完成。
2,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。
自己理解学习的记录,水平渣,可能会有很多错误~
C++多线程(POSIX)的更多相关文章
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...
- OS之进程管理---多线程模型和线程库(POSIX PTread)
多线程简介 线程是CPU使用的基本单元,包括线程ID,程序计数器.寄存器组.各自的堆栈等,在相同线程组中,所有线程共享进程代码段,数据段和其他系统资源. 传统的的单线程模式是每一个进程只能单个控制线程 ...
- Pthread:POSIX 多线程程序设计【转】
转自:http://www.cnblogs.com/mywolrd/archive/2009/02/05/1930707.html#phtread_ref POSIX 多线程程序设计 Blaise ...
- posix多线程--线程取消
1.三种取消状态Off 禁用取消Deferred 推迟取消:在下一个取消点执行取消Asynchronous 异步取消:可以随时执行取消 in ...
- posix多线程--三种基本线程编程模型
本文介绍了三种构建线程解决方案的方式. 一.流水线:每个线程执行同一种操作,并把操作结果传递给下一步骤的线程. 代码示例如下:终端输入一个int值,每个线程将该值加1,并将结果传给下一个线程. #in ...
- posix多线程--条件变量
条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...
- posix多线程--互斥量
多线程程序在线程间共享数据时,如果多个线程同时访问共享数据就可能有问题.互斥量是解决多个线程间共享数据的方法之一. 1.互斥量初始化两种方式:(1)静态初始化 #include <pthread ...
- [posix]Posix多线程编程
就不排版了,可以到原作者博客下看 转自:http://www.cnblogs.com/zhangsf/archive/2013/09/09/3309867.html 目录表 摘要 译者序 Pthre ...
- 多线程编程之Apue3rd_Chapter15.10之posix信号量
看了APUE的chapter15,只重点看了15.10,学习了posix信号量.Posix信号量比起xsi信号量的优点是性能更好,在Linux3.2.0平台上性能提升很大.其中命名信号量使用方法如下. ...
随机推荐
- Codeforces Round #461 (Div. 2) D. Robot Vacuum Cleaner
D. Robot Vacuum Cleaner time limit per test 1 second memory limit per test 256 megabytes Problem Des ...
- DFS:BZOJ1085-骑士精神
题目: 1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1461 Solved: 796 [Submit][ ...
- 爬山算法 | Java版HA_TSP
嗯哼,今天记录下采用Java编写的爬山算法(Hill Algorithm)求解TSP问题. 爬山算法与其他智能算法类似,是一种用来求解多峰函数最值的算法,爬山算法的基本思想是新解不劣于当前解则转移,否 ...
- 某面试公司出的面试题---用JS比较两个版本号高低
一天中午某个公司给我反馈的面试题,说,比较两个文件的版本号,然后我给发过去了,说我的代码不符合他的要求,o(╯□╰)o了var compareVersion = compareVersion||fun ...
- 【word ladder】cpp
题目: Given two words (beginWord and endWord), and a dictionary, find the length of shortest transform ...
- Struts2拦截器原理
拦截器是struts2处理的核心,本文主要说struts2的拦截器的基本原理/实现,其它框架处理的东西就不说了,得自己再看了.struts2版本:2.2.3当一个请求来了后,从org.apache.s ...
- win 8系统下如何安装搭建python
python的环境搭建除了python本身,还有Aptana和pip的安装.Aptana提供了更好的集成开发环境,pip主要用于安装第三方的包. 具体安装流程可参考以下两篇文章: InSky关于安装p ...
- setTimeOut传参数
最近,因项目需要,需要实现setTimeOut传参数的功能,搜索了很多的资源.终于找到一个比较好的方法了,记录下来,与大家分享. 无论是window.setTimeOut还是window.setInt ...
- [POI2005][luogu3462] SZA-Template [fail树]
题面 传送门 思路 首先,我们观察一下这个要求的"模板串",发现它有如下性质: 1.一个模板串$A$是要求的文本串$B$的公共前后缀 2.如果一个模板串$A$有另一个模板串$B$( ...
- Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring
参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...