多线程编程之信号量

Pthread POSIX threads 的简称,是POSIX线程标准

互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制。

信号量机制用于保证两个或多个共享资源被线程协调地同步使用,信号量的值对应当前可用资源的数量。

1.信号量samaphore:

        信号量机制通过信号量的值控制可用资源的数量。线程访问共享资源前,需要申请获取一个信号量,如果信号量为0,说明当前无可用的资源,线程无法获取信号量,则该线程会等待其他资源释放信号量(信号量加1)。如果信号量不为0,说明当前有可用的资源,此时线程占用一个资源,对应信号量减1

        举例:

        停车场有5个停车位,汽车可使用停车位。在这里5个停车位是共享的资源,汽车是线程。开始信号量为5,表明此时有5个停车位可用。一辆汽车进入停车场前,先查询信号量的值,不为0表明有可用停车位,汽车进入停车场并使用一个停车位,信号量减1,表明占用一个停车位,可用数减少。

2.信号量基本函数

#include <semaphore.h>

初始化信号量:

int sem_init(sem_t *sem, int pshared, unsigned int val);

        该函数第一个参数为信号量指针,第二个参数为信号量类型(一般设置为0),第三个为信号量初始值。第二个参数pshared0时,该进程内所有线程可用,不为0时不同进程间可用。

信号量减1

int sem_wait(sem_t *sem);

        该函数申请一个信号量,当前无可用信号量则等待,有可用信号量时占用一个信号量,对信号量的值减1

信号量加1

int sem_post(sem_t *sem);

        该函数释放一个信号量,信号量的值加1

销毁信号量:

int sem_destory(sem_t *sem);

        该函数销毁信号量。       

3.牛刀小试

        采用信号量机制,解决苹果橙子问题:一个能放N(这里N设为3)个水果的盘子,爸爸只往盘子里放苹果,妈妈只放橙子,女儿只吃盘子里的橙子,儿子只吃苹果。

        采用三个信号量:

1.sem_t empty:信号量empty控制盘子可放水果数,初始为3,因为开始盘子为空可放水果数为3

2.sem_t  apple ;信号量apple控制儿子可吃的苹果数,初始为0,因为开始盘子里没苹果。

3.sem_t orange;信号量orange控制女儿可吃的橙子是,初始为0,因为开始盘子里没橙子。

注:互斥量work_mutex只为printf输出时能够保持一致,可忽略。

#include "pthread.h"

#include "sched.h"

#include "semaphore.h"

#include "stdio.h"

#include "windows.h"

#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){

(&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);

}

来自 <https://blog.csdn.net/lovecodeless/article/details/24919511>

【C/C++多线程编程之七】pthread信号量相关推荐

  1. 多线程编程之七:pthread条件变量

    ###Date: 2017/11/14 转载自:http://blog.csdn.net/lovecodeless/article/details/24929273  Pthread是 POSIX t ...

  2. Linux多线程编程:pthread线程创建、退出、回收、分离、取消

    文章目录 Linux线程 1.简单了解一下线程 2.线程创建:pthread_create 3.线程传参注意事项 4.线程退出:pthread_exit 5.线程回收:pthread_join 6.线 ...

  3. 【C/C++多线程编程之十】pthread线程私有数据

    多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编 ...

  4. 【C/C++多线程编程之八】pthread条件变量

    多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程 ...

  5. pthread多线程编程的学习小结

    pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 -- DevStore p ...

  6. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  7. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  8. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

    为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

  9. pthread库进行多线程编程 - 组件工厂 - C++博客

    pthread库进行多线程编程 - 组件工厂 - C++博客 11 Threads 1 Introduction 不用介绍了吧- 2 Thread Concepts 1.     Thread由下面部 ...

最新文章

  1. pandas DataFrame(2)-行列索引及值的获取
  2. 让服务器apache/iis/nginx支持.apk/ipa文件下载
  3. 云栖科技评论第53期:前沿技术要“会说话”
  4. 清华大学人工智能研究院成立大数据智能研究中心
  5. QML基础类型之matrix4x4
  6. WebRTC 视频发送和接收处理过程
  7. HTML中的Content-Type的类型
  8. curl php 禁用ip6,CentOS 6禁用IPv6解决curl Couldn’t resolve host或dns解析慢
  9. 张季跃 201771010139《面向对象程序设计(java)》第十三周学习总结
  10. Codejock Xtreme ToolkitPro MFC 使用
  11. Astar算法基本概念及其实现
  12. latex 参考文献没有显示_LaTeX 中的参考文献
  13. 光波叠加matlab,光波的叠加教程.ppt
  14. ZUCC_BB平台-Quiz
  15. 2022版中国科技中介服务产业运行现状分析与发展机遇规划报告
  16. 为什么微信显示这个android设备,微信显示安卓手机型号在哪设置
  17. h5后缀文件python处理
  18. 请开启微信或者手机定位服务器,微信在哪里设置定位(微信开启定位功能设置)...
  19. 人员管理系统+报销系统
  20. ·2010考研数学二第(19)题——多元微分学:复合函数求偏导、链式法则

热门文章

  1. hdu 4556 Stern-Brocot Tree
  2. vue项目 预览照片的插件 v-viewer
  3. 00075_BigInteger
  4. 用MOS管防止电源反接的原理
  5. 实验一 OpenGL初识
  6. iOS 开发中需要注意的小地方
  7. tensorflow调用问题解决
  8. css hack方法,css hack怎么应用
  9. 降噪电路_拆解报告:Mobvoi出门问问 Ticpods ANC 真无线降噪耳机
  10. 科大星云诗社动态20210508