【C/C++多线程编程之七】pthread信号量
多线程编程之信号量
初始化信号量:
int sem_init(sem_t *sem, int pshared, unsigned int val);
信号量减1:
int sem_wait(sem_t *sem);
信号量加1:
int sem_post(sem_t *sem);
销毁信号量:
int sem_destory(sem_t *sem);
#include
#include
#include
#include
#pragma comment(lib, "pthreadVC2.lib") //必须加上这句
sem_t empty; //控制盘子里可放的水果数
sem_t apple; //控制苹果数
sem_t orange; //控制橙子数
pthread_mutex_t work_mutex; //声明相互排斥量work_mutex
void *procf(void *arg) //father线程
{
while(1){
sem_wait(&empty); //占用一个盘子空间,可放水果数减1
pthread_mutex_lock(&work_mutex); //加锁
printf("爸爸放入一个苹果!\n");
sem_post(&apple); //释放一个apple信号了。可吃苹果数加1
pthread_mutex_unlock(&work_mutex); //解锁
Sleep(3000);
}
}
void *procm(void *arg) //mother线程
{
while(1){
sem_wait(&empty);
pthread_mutex_lock(&work_mutex); //加锁
printf("妈妈放入一个橙子!\n");
sem_post(&orange);
pthread_mutex_unlock(&work_mutex); //解锁
Sleep(4000);
}
}
void *procs(void *arg) //son线程
{
while(1){
sem_wait(&apple); //占用一个苹果信号量。可吃苹果数减1
pthread_mutex_lock(&work_mutex); //加锁
printf("儿子吃了一个苹果!\n");
sem_post(&empty); //吃了一个苹果,释放一个盘子空间,可放水果数加1
pthread_mutex_unlock(&work_mutex); //解锁
Sleep(1000);
}
}
void *procd(void *arg) //daughter线程
{
while(1){
sem_wait(&orange);
pthread_mutex_lock(&work_mutex); //加锁
printf("女儿吃了一个橙子!\n");
sem_post(&empty);
pthread_mutex_unlock(&work_mutex); //解锁
Sleep(2000);
}
}
void main()
{
pthread_t father; //定义线程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(&empty, 0, 3); //信号量初始化
sem_init(&apple, 0, 0);
sem_init(&orange, 0, 0);
pthread_mutex_init(&work_mutex, NULL); //初始化相互排斥量
pthread_create(&father,NULL,procf,NULL); //创建线程
pthread_create(&mother,NULL,procm,NULL);
pthread_create(&daughter,NULL,procd,NULL);
pthread_create(&son,NULL,procs,NULL);
Sleep(1000000000);
}
【C/C++多线程编程之七】pthread信号量的更多相关文章
- 多线程编程(一)-Semaphore(信号量)的使用
Semaphore的介绍 单词Semaphore的中文含义就是信号.信号系统的意思,此类的主要作用就是限制线程并发的数量. 举个例子,一个屋子里有10个人,但只有一个窄门可以出去,这个窄门一次最多只能 ...
- 多线程编程-- part 9 信号量:Semaphore
Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量 ...
- C#多线程编程のSemaphore(信号量,负责协调各个线程)
Semaphore负责协调线程,可以限制对某一资源访问的线程数量 这里对SemaphoreSlim类的用法做一个简单的例子: namespace WpfApplication6 { /// <s ...
- 【C/C++多线程编程之十】pthread线程私有数据
多线程编程之线程私有数据 Pthread是 POSIX threads 的简称.是POSIX的线程标准. 线程同步从相互排斥量[C/C++多线程编程之六]pthread相互排 ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程
为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...
- 为什么对多线程编程这么怕?pthread,sem,mutex,process
转自http://blog.chinaunix.net/uid-20788636-id-1841334.html 1.线程创建和退出创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是p ...
- Linux多线程编程-信号量
在Linux中.信号量API有两组.一组是多进程编程中的System V IPC信号量.另外一组是我们要讨论的POSIX信号量. 这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并 ...
- Linux下多线程编程-信号量
今天来谈谈线程的同步--信号量. 首先来看看一些概念性的东西: 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给 ...
随机推荐
- 网络结构解读之inception系列五:Inception V4
网络结构解读之inception系列五:Inception V4 在残差逐渐当道时,google开始研究inception和残差网络的性能差异以及结合的可能性,并且给出了实验结构. 本文思想阐述不多, ...
- 次短路poj3463
poj3463大意:统计最小的长度个数+统计最小的长度+1的个数,大概就是求最短路和次短路的条数更新的时候有5种情况,有个细节就是它得是二维的,一个表示节点编号,一个0/1表示它是次短路的还是最短路的 ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--07--06CMDB测试Linux系统采集硬件数据的命令02
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- 你所不知道的Mac截图的强大
Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...
- python基础---递归函数 知识点自查填空题
什么是递归函数:在函数中调()叫递归函数. 递归函数最大递归深度是997或998----是()设的限制. 注:如果递归次数太多,就不适合使用递归来解决问题. 递归的缺点: 占(). 递归的优点:会让代 ...
- apt-get正在等待报头(waiting for headers)
可能的解决方法 1. 删除/var/cache/apt/archives/下的所有文件.可能是上次没有成功导致遗留了部分文件. 2. 如果使用的是代理,需要检查DNS.如果机器不能连接DNS服务器,要 ...
- 关于JVM调优
JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略.由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间. 减少Full GC次 ...
- SpringCloud是如何运行的?
SpringCloud是基于SpringBoot这一高度自动化的应用开发框架,将各类业界比较知名的.得到过实践反馈的开元服务治理相关的技术框架进行优化整合的框架,是一种开发方式的优化和组合,,是一组框 ...
- Leetcode506.Relative Ranks相对名次
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予 "金牌","银牌" 和" 铜牌"(" ...
- 如何修改MyEclipse的SVN账户和密码
如何修改MyEclipse的SVN账户和密码呢? 操作方法:删除C:\Users\Administrator\AppData\Roaming\Subversion\auth\svn.simple文件夹 ...