C++多线程编程学习三 [FIFO队列设计]

    技术2022-05-20  44

    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的使用方法。


    最新回复(0)