http://blog.csdn.net/nellson/archive/2010/02/06/5293519.aspx
在网络编程中,FIFO队列是经常使用到的一个数据缓冲机制,同时这也是一个生产者与消费者问题,在设计过程中要注意以下几点。队列大小设计要科学,对于服务的强度而言,有一个最优化长度,要通过测试去发掘。数据竞争保护,通过设定条件互斥量,对涉及队列的操作进行保护。事件通知策略,两个线程,一个读,一个写,每写一个数据到队列中就要进行“事件通知”,而读消息每 次读消息前都要检测事件是否处在信号通知状态,若不处在信号通知状态则阻塞,每次读完数据后,检测队列是否为空,如为空则设定事件为非信号通知状态。 下面我将给出源代码,WIN32 C++撰写。#include <process.h>#include <windows.h>#include <queue>#include <iostream>#define BUFSIZ 50using namespace std;unsigned _stdcall ThreadWrite(void *X);unsigned _stdcall ThreadRead(void *X);queue<int> Buffer;HANDLE hBufferEvent;HANDLE hBufferMutex;void main(){ hBufferEvent = CreateEvent(FALSE, TRUE, FALSE, 0);hBufferMutex = CreateMutex(FALSE, FALSE, FALSE);ReleaseMutex(hBufferMutex);unsigned long id_thread_write, id_thread_read;id_thread_write = _beginthreadex(NULL, 0, ThreadWrite, 0, 0, NULL);id_thread_read = _beginthreadex(NULL, 0, ThreadRead, 0, 0, NULL);WaitForSingleObject((HANDLE)id_thread_read, INFINITE);WaitForSingleObject((HANDLE)id_thread_write, INFINITE);}unsigned _stdcall ThreadWrite(void *X){int Item = 1;while (TRUE){ if (WAIT_OBJECT_0 == WaitForSingleObject(hBufferMutex, 100)) { if (Buffer.size() == BUFSIZ) { ReleaseMutex(hBufferMutex); continue; } Buffer.push(Item); ReleaseMutex(hBufferMutex); SetEvent(hBufferEvent); } else { continue; } Item++; if (Item == 100) { Sleep(1000); Item = 0; }}cout << "ThreadWrite returned!" << endl;return 0;}unsigned _stdcall ThreadRead(void *x){while(TRUE){ WaitForSingleObject(hBufferEvent, INFINITE); if (WAIT_OBJECT_0 == WaitForSingleObject(hBufferMutex, 100)) { cout << "Value is" << Buffer.front() << endl; Buffer.pop(); if (Buffer.empty()) { ResetEvent(hBufferEvent); ReleaseMutex(hBufferMutex); continue; } ReleaseMutex(hBufferMutex); }}cout << "ThreadRead returned!" << endl;return 0;}主要是注意事件通知与数据保护的合作性,这是个很简单的例子,但有助于理解Mutex和Event的使用方法。