多线程PV操作

PV操作

P操作: passeren "通过"

V操作:vrijgeven "释放"

P操作定义

(1)sem减一。

(2)若sem>=0,则P操作返回,该线程可以“通过”并继续执行。

(3)若sem<0,则该线程被阻塞,进入操作系统的阻塞列队。

作定义

(1)sem加一(释放)。

(2)若sem>0,则V操作返回,该线程继续执行。

(3)若sem<=0,则从阻塞队列中唤醒一个阻塞再该信号量上的线程,然后再返回原线程(调用V操作的线程)继续执行。

 

 

#include<iostream>
#include<process.h>
#include<windows.h>
#include<queue>

using namespace std;

//定义事件
HANDLE hEvent1;
HANDLE hEvent2;

//队列(仓库)
queue<int> store;
int storeSize = 3;  //队列最大容量
int ID = 1;         //商品名称
//线程函数
void PThread(LPVOID paramer);
void RThread(LPVOID paramer);

//商品出入库时间
int arrytime1[] = { 1,2,5,3,2,2,6,8,2,4 };
int arrytime2[] = { 2,3,6,5,4,8,2,1,6,3 };


int main()
{
	//创建时间对象
	hEvent1 = CreateEvent(NULL, TRUE, TRUE, L"生产者");
	hEvent2 = CreateEvent(NULL, TRUE, FALSE, L"消费者");

	//创建线程
	HANDLE hThread1 =(HANDLE) _beginthread(PThread, 0, NULL);
	HANDLE hThread2 = (HANDLE)_beginthread(RThread, 0, NULL);

	//等待线程全部结束
	HANDLE arry[] = { hThread1,hThread2 };
	WaitForMultipleObjects(2, arry, TRUE, INFINITE);

	
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	return 0;
}


void PThread(LPVOID paramer)
{
	while (true)
	{
		//等待生产者
		WaitForSingleObject(hEvent1, INFINITE);
		//仓库小于其最大容量时
		if (store.size() < storeSize)
		{
			int id = ID++;
			printf("生产编号为:%d商品\n", id);
			store.push(id);  //生产 加入仓库
			Sleep(arrytime1[id % 10] * 1000);
		}
		else
		{
			//仓库=最大容量时 停止生产 设为无信号
			ResetEvent(hEvent1);
			printf("仓库满了\n");
		}
		if (store.size() > 0)
		{
			SetEvent(hEvent2);  //事件消费者为有信号告诉消费者可以消费了
		}
	}
}

void RThread(LPVOID paramer)
{
	while (true)
	{
		//等待消费者
		WaitForSingleObject(hEvent2, INFINITE);
		if (store.size() > 0)
		{
			//获取队列内容 先进先出
			int id = store.front();
			//弹出队列 已消费
			store.pop();
			printf("\t\t\t消费:%d商品\n", id);
			Sleep(arrytime2[id % 10] * 1000);
		}
		else
		{
			//仓库 空了 停止消费 设为无信号
			ResetEvent(hEvent2);
			printf("\t\t\t仓库空了\n");
		}
		if (store.size() < storeSize)
		{
			//事件生产者为有信号告诉生产者可以生产了
			SetEvent(hEvent1);
		}
	}
}

 

 

均为自己学习时所做记录 方便日后查阅

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值