C++多线程编程:同步之PV操作

C++多线程编程:同步之PV操作

2023年6月22日发(作者:)

C++多线程编程:同步之PV操作⽂章⽬录1. PV操作P操作:passeren,译为"通过“V操作:vrigeven,译为“释放”2. P操作1)sem减1。2)若sem>=0,则P操作返回,该线程程可以“通过”并继续执⾏。3)若sem<0,则该线程被阻塞,进⼊操作系统的阻塞队列。3. V操作1)sem加1(释放)。2)若sem>0,则V操作返回,该线程继续执⾏。3)若sem<=0,则从阻塞队列中唤醒⼀个阻塞在该信号量上的线程,然后再返回原线程(调⽤ν操作的线程)继续执⾏。4. ⽣产者消费者问题⽣产者消费者问题(Producer-consumer problem)是⼀个多线程经典案例,该问题描述了两个线程(“⽣产者”和“消费者”)使⽤块缓冲区。⽣产者⽣成数据放到缓冲区中,消费者在缓冲区取出数据。问题的关键就是要保证⽣产者不会在缓冲区满时加⼊数据,消费者也不会在缓冲区空时取出数据。5. 代码⽰例#include#include#include

using namespace std;//有⼀个仓库queue store;int StoreSize = 3;//

仓库可以放3个货物int ID = 1;//货物起始ID//随机时间数组,模拟随机⽣产与消费的速度int arr1[10] = { 2,1,4,0,3,4,6,1,9,0};int arr2[10] = { 1,9,5,4,9,3,4,0,2,6};//需要两个event来通知HANDLE hEvent1 = INVALID_HANDLE_VALUE;//有货物时通知消费者取货物HANDLE hEvent2 = INVALID_HANDLE_VALUE;//仓库为空通知消费者开始⽣产//⽣产者void ProducerThread(LPVOID param);//消费者void ConsumerThread(LPVOID param);int main(){ hEvent1 = CreateEvent(NULL, TRUE, TRUE, L"事件对象1");//需要先开始⽣产 hEvent2 = CreateEvent(NULL, TRUE, FALSE, L"事件对象2");//⼀开始,仓库没货取 uintptr_t t1= _beginthread(ProducerThread, 0, NULL); uintptr_t t1= _beginthread(ProducerThread, 0, NULL); uintptr_t t2 = _beginthread(ConsumerThread, 0, NULL); //⽆限等待两个线程运⾏结束 HANDLE hArr []= { (HANDLE)t1 ,(HANDLE)t2 }; WaitForMultipleObjects(2, hArr, TRUE, INFINITE); CloseHandle(hEvent1); CloseHandle(hEvent2); return 0;}//⽣产者void ProducerThread(LPVOID param){ while (TRUE) { //看event是否允许⽣产 WaitForSingleObject(hEvent1, INFINITE); if (() < StoreSize)//有仓库空位才⽣产 { int id = ID++;//货物ID号 printf("⽣产货物: %dn" , id); (id);//把货物放置到仓库中 Sleep( arr1[id%10] *1000 );//⽣产有时快,有时慢 } else //仓库满了,需要停⽌⽣产 { ResetEvent(hEvent1);//把事件设为⽆信号状态 printf("仓库满了!n"); } //仓库有货物,可以通知消费者取货物 if (() > 0) { SetEvent(hEvent2);//让消费者的事件对象为有信号 } }

}//消费者void ConsumerThread(LPVOID param){ while (TRUE) { //看event2是否允许取货物 WaitForSingleObject(hEvent2, INFINITE); if (() > 0) { int id = ();//获取队列中的货物,先进先出 ();//卸⾛货物,腾出仓库空位 printf(" 取出货物: %dn", id); Sleep(arr2[id % 10] * 1000); } else //仓库空了 { ResetEvent(hEvent2);//设为⽆信号,不能取货物了 printf(" 仓库空了!n"); } if (() < 3)//说明仓库没有满,可以继续⽣产 if (() < 3)//说明仓库没有满,可以继续⽣产 { SetEvent(hEvent1);//通知⽣产者继续⽣产货物 } }}

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687423776a9004.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信