多线程信号量PV操作初探
直接上源码吧:
在主线程中创建一个信号量mutex(注意参数,当前值和最大值都设为1),开启总计PRODUCER_COUNT份producer线程,不停地对该信号量mutex进行PV操作;再开启COMSUNER_COUNT份comsumer线程尝试获取信号量mutex,并打印时间。
主要用到以下函数:
函数CreateSemaphore用来创建信号量,其中第二个和第三个参数表示资源的当前值和最大值。
函数WaitForSingleObject获取信号量权限,使用((ret_code == WAIT_OBJECT_0) || (ret_code == WAIT_ABANDONED))来判断P操作成功。
函数ReleaseSemaphore来释放信号量。
信号量的用途在于保证一个某变量(注意被操作变量,不是信号量本身,信号量只是一个加锁的标志)在同一时间只被一个线程编辑,机上锁解锁的功能,确保某变量再多线程间是同步的,不会发生冲突。
#include <iostream>
#include <windows.h>
#include <stdio.h>
#define p(s) WaitForSingleObject(s, INFINITE);
#define vs(s) ReleaseSemaphore(s,1,NULL);
//#define vm(s) ReleaseMutex(s);const int PRODUCER_SLEEP_TIME=100;
const int CONSUMER_SLEEP_TIME=100;const int PRODUCER_COUNT=10;
const int CONSUMER_COUNT=1;using namespace std;//定义信号量
HANDLE mutex;//生产者线程
DWORD WINAPI Producer(LPVOID producer)
{while(true){int ret_code = p(mutex);if ((ret_code == WAIT_OBJECT_0) || (ret_code == WAIT_ABANDONED)){;//printf("Producer:: P success !\n");}else{printf("Producer:: P fail !!! err_code = %d\n",GetLastError());}Sleep(PRODUCER_SLEEP_TIME);BOOL a=vs(mutex);if (a == TRUE){;//printf("Producer:: V success !\n");;}else{printf("Producer:: V fail !!! err_code = %d\n",GetLastError());}}return 0;
}
//消费者线程
DWORD WINAPI Consumer(LPVOID consumer)
{ while(true){int ret_code = p(mutex);if ((ret_code == WAIT_OBJECT_0) || (ret_code == WAIT_ABANDONED)){;//printf("Consumer:: P success !\n");;}else{printf("Consumer:: P fail !!! err_code = %d\n",GetLastError());}SYSTEMTIME sys; GetLocalTime( &sys ); printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); Sleep(CONSUMER_SLEEP_TIME);BOOL a=vs(mutex);if (a == TRUE){;//printf("Consumer:: V success !\n");;}else{printf("Consumer:: V fail !!! err_code = %d\n",GetLastError());}}return 0;
}int main()
{ //创建信号量对象mutex = CreateSemaphore(NULL,1,1,NULL);DWORD producer_id[PRODUCER_COUNT]; //生产者线程的标识符DWORD consumer_id[CONSUMER_COUNT]; //消费者线程的标识符 for(int i=0; i<PRODUCER_COUNT; i++){CreateThread(NULL,0,Producer,NULL,0,&producer_id[i]); }//创建消费者线程for(int i=0; i<CONSUMER_COUNT; i++){CreateThread(NULL,0,Consumer,NULL,0,&consumer_id[i]);} getchar();getchar();
}
多线程信号量PV操作初探相关推荐
- linux pv 信号量,pv操作与信号量(示例代码)
在python同步编程部分,需要分析和思考多个线程之间同步互斥问题,因此pv操作和信号量作为基础和重中之重,特此回顾pv操作和信号量. PV操作由P操作原语和V操作原语组成(原语即不可在分割的操作), ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 信号量PV操作以及函数接口讲解
systemV消息队列-不用详细了解 创建消息队列msgget函数,删除msgctl函数,发消息msgsnd,收消息msgrcv 信号量Semaphore 了解5个概念 信号量本质上是一个计数器,用来 ...
- linux pv 信号量,Linux信号量PV操作
1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作. 2://利用信号量实现pv操作 3:#include 4:#include 5:#include ...
- 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...
- Operating System-进程/线程内部通信-信号量和PV操作
本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...
- 【软考】PV操作同步互斥
进程 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源),一个进程能有多个线程. 临界资源 指一次只能有一个进程在占用的资源.如 ...
- 秒杀多线程第十二篇 多线程同步内功心法——PV操作上
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 多线程面试题系列(12):多线程同步内功心法——PV操作上
上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...
最新文章
- python环境配置是什么意思_python环境搭建
- 输入/输出延迟单元( IODELAY)简介
- html行间距1.8em,雅黑字体下WordPress 行高与字符间距最佳实践:1.8em与0.06em
- 每日一皮:前程序员离职后没人想接的代码...
- windbg调试命令2(!gle、g、p)
- Alpha 冲刺 (7/10)
- 在你的网站集成Wiki系统 WikiPlex
- Django Step by Step中文版,推荐一下
- mysql查找最大值最小值_查找两个8位数字的最大值| 8086微处理器
- 随笔-机器如何学习我们的知识?
- 分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)
- 虎牙AI基础技术部招聘深度学习/计算机视觉实习生
- (01)VHDL介绍
- 直方图均衡化与直方图规定化
- JQ插件OrgChart实现组织结构图
- 在现有Fabric 2.2.0 网络上设置和运行Caliper性能测试 实战
- PAT(乙级) 1045 快速排序
- Blazor发布问题,localhost可以访问,局域网无法访问
- 实验一-Bomblab(炸弹实验)
- 以静制动的TensorFlow Fold