日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

生产者-消费者模型

發(fā)布時(shí)間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者-消费者模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
生產(chǎn)者-消費(fèi)者模型,覺得使用信號(hào)量是最簡(jiǎn)單的,但效率上可能會(huì)有些影響,因?yàn)槊看螌?duì)消息的操作都要從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)。 什么是生產(chǎn)者-消費(fèi)者模型,即多個(gè)模塊產(chǎn)生數(shù)據(jù),另外多個(gè)模塊取得數(shù)據(jù)并進(jìn)行處理。如何實(shí)現(xiàn)互斥?如何讓生產(chǎn)者和消費(fèi)者都能夠方便的工作? 本設(shè)計(jì)的主要特色為: ·消息的大小、結(jié)構(gòu)是自由的,甚至可以是一個(gè)對(duì)象;
·消息隊(duì)列的長(zhǎng)度(容納消息的個(gè)數(shù))是可設(shè)定的;
·添加消息是阻塞的,即如果隊(duì)列已滿,不能再添加消息;
·代碼少,思路簡(jiǎn)潔,可以根據(jù)情況擴(kuò)展.
以下是該模型的實(shí)現(xiàn): template?<class?T>?
class?PCM_SEM
{
public:
????//?constructor
????PCM_SEM(int?nSize)
????{
????????InitializeCriticalSection(&m_csLock);
????????_ASSERT(m_hPushSemaphore?=?CreateSemaphore(NULL,?nSize,?nSize,?NULL));
????????_ASSERT(m_hPopSemaphore?=?CreateSemaphore(NULL,?0,?nSize,?NULL));
????}

????//?destructor
????~PCM_SEM()
????{
????????m_listUserData.clear();
????????CloseHandle(m_hPopSemaphore);
????????CloseHandle(m_hPushSemaphore);
????????DeleteCriticalSection(&m_csLock);
????}

????//?wait?for?the?semaphore?to?add?the?msg
????void?Push(T&?t)
????{
????????_ASSERT(WaitForSingleObject(m_hPushSemaphore,?INFINITE)?==?WAIT_OBJECT_0);
????????EnterCriticalSection(&m_csLock);
????????m_listUserData.push_back(t);
????????ReleaseSemaphore(m_hPopSemaphore,?1,?NULL);
????????LeaveCriticalSection(&m_csLock);
????}

????//?wait?for?the?semaphore?to?get?the?msg
????T?Pop()
????{
????????_ASSERT(WaitForSingleObject(m_hPopSemaphore,?INFINITE)?==?WAIT_OBJECT_0);
????????EnterCriticalSection(&m_csLock);
????????T?t?=?m_listUserData.front();
????????m_listUserData.pop_front();
????????ReleaseSemaphore(m_hPushSemaphore,?1,?NULL);
????????LeaveCriticalSection(&m_csLock);
????????return?t;
????}

private:
????CRITICAL_SECTION?m_csLock;?
????HANDLE???m_hPopSemaphore;
????HANDLE???m_hPushSemaphore;
????list<T>??m_listUserData;
};

下面是該模型的使用:

const?int?SIZE_BUFFER?=?100;

PCM_SEM<int>?pcmData(SIZE_BUFFER);

unsigned?__stdcall?Producer(LPVOID?lpPara)
{
????int?i?=?0;
????for?(?;?;?)
????{
????????i++;
????????stringstream?ss;
????????ss?<<?"Produce?No.?"?<<?i?<<?"?Product!"?<<?endl;
????????cout?<<?ss.str();
????????pcmData.Push(i);
????????Sleep(10);
????}

????return?0;
}

unsigned?__stdcall?Consumer(LPVOID?lpPara)
{
????for?(?;?;?)
????{
????????stringstream?ss;
????????ss?<<?"Consume?No.?"?<<?pcmData.Pop()?<<?"?Product!"?<<?endl;
????????cout?<<?ss.str();
????????Sleep(50);
????}

????return?0;
}

int?main(int?argc,?char*?argv[])
{
????if?(_beginthreadex(NULL,?0,?&Producer,?NULL,?0,?NULL)?==?NULL)?
????{
????????return?-1;
????}

????if?(_beginthreadex(NULL,?0,?&Consumer,?NULL,?0,?NULL)?==?NULL)?
????{
????????return?-1;
????}

????return?getchar();
}

轉(zhuǎn)載于:https://www.cnblogs.com/Coterjiesen/p/4900519.html

總結(jié)

以上是生活随笔為你收集整理的生产者-消费者模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。