生产者和消费者

来源:互联网 发布:云计算运维和售前 编辑:程序博客网 时间:2024/06/11 03:53
#include <process.h>#include <Windows.h>#include <iostream>#define BUFFER_CAPACITY 20#define MAX_WAIT_TIME INFINITE#define THREAD_NUM 20class Buffer{public:Buffer(){m_capacity = BUFFER_CAPACITY;m_size = 0;InitializeCriticalSection(&m_section);m_hProceduSemaphore = CreateSemaphore(NULL, BUFFER_CAPACITY, BUFFER_CAPACITY, NULL);m_hCustomSemaphore = CreateSemaphore(NULL, 0, BUFFER_CAPACITY, NULL);}Buffer(unsigned int size){m_capacity = size;m_size = 0;InitializeCriticalSection(&m_section);m_hProceduSemaphore = CreateSemaphore(NULL, size, size, NULL);m_hCustomSemaphore = CreateSemaphore(NULL, 0, size, NULL);}unsigned int Size(){return m_size;}bool Increment(){if(WAIT_TIMEOUT == WaitForSingleObject(m_hProceduSemaphore, MAX_WAIT_TIME))return false;EnterCriticalSection(&m_section);++m_size;std::cout << "buffer increment" << std::endl;ReleaseSemaphore(m_hCustomSemaphore, 1, NULL);LeaveCriticalSection(&m_section);return true;}bool Decrement(){if(WAIT_TIMEOUT == WaitForSingleObject(m_hCustomSemaphore, MAX_WAIT_TIME))return false;EnterCriticalSection(&m_section);--m_size;std::cout << "buffer decrement" << std::endl;ReleaseSemaphore(m_hProceduSemaphore, 1, NULL);LeaveCriticalSection(&m_section);return true;}~Buffer(){CloseHandle(m_hProceduSemaphore);CloseHandle(m_hCustomSemaphore);DeleteCriticalSection(&m_section);}private:unsigned int m_size;unsigned int m_capacity;CRITICAL_SECTION m_section;HANDLE m_hProceduSemaphore;HANDLE m_hCustomSemaphore;};class Producer{public:Producer(){}~Producer(){}bool Produce(Buffer& buf){//some work to doreturn buf.Increment();}};class Customer{public:Customer(){}~Customer(){}bool Custom(Buffer& buf){return buf.Decrement();//some work to do }};Buffer g_buf;unsigned int __stdcall ProduceThread(void* pParam){Producer* p = static_cast<Producer*>(pParam);p->Produce(g_buf);return 0;}unsigned int __stdcall CustomThread(void* pParam){Customer* c = static_cast<Customer*>(pParam);c->Custom(g_buf);return 0;}int _tmain(int argc, _TCHAR* argv[]){Producer p;HANDLE pProduceThread[THREAD_NUM];for(int i = 0; i < THREAD_NUM; ++i)pProduceThread[i] = (HANDLE)_beginthreadex(NULL, 0, ProduceThread, static_cast<void*>(&p), 0, NULL);//std::cin.get();//std::cout << g_buf.Size() << std::endl;Customer c;HANDLE pCustomThread[THREAD_NUM];for(int i = 0; i < THREAD_NUM; ++i)pCustomThread[i] = (HANDLE)_beginthreadex(NULL, 0, CustomThread, static_cast<void*>(&c), 0, NULL);WaitForMultipleObjects(THREAD_NUM, pProduceThread, TRUE, INFINITE);WaitForMultipleObjects(THREAD_NUM, pCustomThread, TRUE, INFINITE);return 0;}

0 0
原创粉丝点击