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平台上性能提升很大.其中命名信号量使用方法如下. ...
随机推荐
- vector函数用法
vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的 ...
- 记忆化搜索:POJ1579-Function Run Fun(最基础的记忆化搜索)
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14815 Accepted: 7659 Des ...
- Linux 内核源码外编译 linux模块--编译驱动模块的基本方法
1.先编写一个简单的hello模块,hello.c 源码如下: #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # defin ...
- Storm Ack容错机制
- 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏 ...
- 【Restore IP Addresses 】cpp
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- linux环境搭建系列之Apache MQ安装
1.创建文件夹 #mkdir MQ 2.解压 #tar -vxf apache-activemq-5.14.3-bin.tar.gz 3.进入解压后的目录 # cd apache-activemq-5 ...
- 对于xss等有关的html,url,unicode编码做的一个小总结。
参考:http://bobao.360.cn/learning/detail/292.html,算是对前部分作一个总结性的学习. 1<a href="%6a%61%76%61%73%6 ...
- Python + Selenium 自动化环境搭建过程
1. 所需组建 1.1 Selenium for python 1.2 Python 1.3 Notepad++ 作为刚初学者,这里不建议使用Python IDE工具,选择一个功能强大的记事本 ...
- 菜鸟之路——机器学习之Kmeans聚类个人理解及Python实现
一些概念 相关系数:衡量两组数据相关性 决定系数:(R2值)大概意思就是这个回归方程能解释百分之多少的真实值. Kmeans聚类大致就是选择K个中心点.不断遍历更新中心点的位置.离哪个中心点近就属于哪 ...