WIN32 使用事件实现高效生产者消费者模型
生活随笔
收集整理的這篇文章主要介紹了
WIN32 使用事件实现高效生产者消费者模型
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
WIN32 如何實(shí)現(xiàn)線程同步
WIN32 多線程編程中,可以使用臨界區(qū)(CRITICAL_SECTION)和互斥體(MUTEX)實(shí)現(xiàn)線程互斥。但是對于同步問題,如果用上述兩種方法實(shí)現(xiàn),效率比較低,原因是它們必須通過條件判斷來決定是否使用資源,CPU會(huì)不停的調(diào)度子線程。
于是,為了高效地解決同步問題,WINDOWS提供了事件機(jī)制(不是消息循環(huán)那個(gè)事件)。事件是一種內(nèi)核對象,使用事件,我們可以完成臨界區(qū)和互斥體的工作,而且事件可以設(shè)置初始通知狀態(tài),和是否自動(dòng)重置通知狀態(tài),因此,事件使用起來更加自由,更重要的是,使用事件來實(shí)現(xiàn)線程同步不需要通過條件判斷的方式,CPU不會(huì)給阻塞的線程分配時(shí)間片,這樣效率更高。
下面用兩個(gè)程序來說明,如何使用臨界區(qū)和事件來實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型,以及為什么使用事件效率更高。
事件實(shí)現(xiàn)(效率高)
/************************************************************************/ /* 使用事件實(shí)現(xiàn)生產(chǎn)者消費(fèi)者 */ /************************************************************************/#include "stdafx.h" #include <WINDOWS.H> #include <STDIO.H>HANDLE evtProduced, evtConsumed; // 生產(chǎn)/消費(fèi)完成事件 int nProduct = 0; // 商品數(shù)量// 生產(chǎn)者線程 DWORD WINAPI ThreadProducer(LPVOID p) {while (TRUE){// 由于 CreateEvent 的第二個(gè)參數(shù)是 FALSE,WaitForSingleObject 會(huì)自動(dòng)將事件設(shè)置為未通知WaitForSingleObject(evtConsumed, INFINITE); // 等待消費(fèi)者消費(fèi)完成Sleep(2000); // 生產(chǎn)商品消耗時(shí)間nProduct += 5;printf("生產(chǎn)了5個(gè)商品,當(dāng)前商品數(shù)量: %d\n", nProduct); SetEvent(evtProduced); // 通知消費(fèi)者可以消費(fèi)了}return 0; }// 消費(fèi)者線程 DWORD WINAPI ThreadConsumer(LPVOID p) {while (TRUE){// 由于 CreateEvent 的第二個(gè)參數(shù)是 FALSE,WaitForSingleObject 會(huì)自動(dòng)將事件設(shè)置為未通知WaitForSingleObject(evtProduced, INFINITE);while (nProduct > 0){nProduct--;printf("--------------消耗了1個(gè)商品,當(dāng)前商品數(shù)量: %d\n", nProduct);Sleep(200);} SetEvent(evtConsumed); } return 0; }int main(int argc, char* argv[]) {evtConsumed = CreateEvent(0, FALSE, TRUE, 0); // 初始狀態(tài):已消費(fèi)(可以開始生產(chǎn))evtProduced = CreateEvent(0, FALSE, FALSE, 0); // 初始狀態(tài):未生產(chǎn)(不可以消費(fèi)) CreateThread(0,0,ThreadProducer,0,0,0);CreateThread(0,0,ThreadConsumer,0,0,0);getchar();return 0; }臨界區(qū)實(shí)現(xiàn)(效率低)
/************************************************************************/ /* 使用臨界區(qū)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者 */ /************************************************************************/#include "stdafx.h" #include <WINDOWS.H> #include <STDIO.H>CRITICAL_SECTION cs; // 商品臨界區(qū)鎖鎖 int nProduct = 0; // 商品數(shù)量DWORD WINAPI ThreadProducer(LPVOID p) {while (TRUE){EnterCriticalSection(&cs);if (nProduct == 0){nProduct += 5;printf("生產(chǎn)了5個(gè)商品,當(dāng)前商品數(shù)量: %d\n", nProduct);} LeaveCriticalSection(&cs);Sleep(2000);}return 0; }DWORD WINAPI ThreadConsumer(LPVOID p) {while (TRUE){ EnterCriticalSection(&cs);if (nProduct > 0){nProduct--;printf("--------------消耗了1個(gè)商品,當(dāng)前商品數(shù)量: %d\n", nProduct);}LeaveCriticalSection(&cs);Sleep(200);}return 0; }int main(int argc, char* argv[]) {InitializeCriticalSection(&cs); CreateThread(0,0,ThreadProducer,0,0,0);CreateThread(0,0,ThreadConsumer,0,0,0);Sleep(12345);return 0; }總結(jié)
以上是生活随笔為你收集整理的WIN32 使用事件实现高效生产者消费者模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WIN32 使用 MUTEX 实现禁止多
- 下一篇: WIN32 多线程吃字母练习