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);
}
}
}
均为自己学习时所做记录 方便日后查阅