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

来源:互联网 发布:java逆序输出一个整数 编辑:程序博客网 时间:2024/06/16 07:25

   在网络编程中,FIFO队列是经常使用到的一个数据缓冲机制,同时这也是一个生产者与消费者问题,在设计过程中要注意以下几点。
队列大小设计要科学,对于服务的强度而言,有一个最优化长度,要通过测试去发掘。
数据竞争保护,通过设定条件互斥量,对涉及队列的操作进行保护。
事件通知策略,两个线程,一个读,一个写,每写一个数据到队列中就要进行“事件通知”,而读消息每     次读消息前都要检测事件是否处在信号通知状态,若不处在信号通知状态则阻塞,每次读完数据后,检测队列是否为空,如为空则设定事件为非信号通知状态。
    下面我将给出源代码,WIN32 C++撰写。
#include <process.h>
#include <windows.h>
#include <queue>
#include <iostream>
#define  BUFSIZ 50
using 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的使用方法。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 六个月宝宝粘人怎么办 11个月宝宝粘人怎么办 一岁宝宝脸冻了怎么办 2个月宝宝粘人怎么办 8个月宝宝粘人怎么办 9个月宝宝粘人怎么办 8个月婴儿粘人怎么办 4个月宝宝粘人怎么办 7个月宝宝粘人怎么办 8个月孩子太粘人怎么办 7个月宝宝太粘人怎么办 两岁宝宝粘人怎么办 孩子屁股被打了怎么办 长期被骂的孩子怎么办 儿童感冒咳嗽怎么办最有效 打了排卵针不排卵怎么办 孩孑上课不专心怎么办 4岁上课不听讲怎么办 孩子上课不认真听讲怎么办 孩子做什么都慢怎么办 7岁上课不听讲怎么办 打孩子脸肿了怎么办 一岁宝宝太调皮怎么办 怀孕早期喝了酒怎么办 怀孕期间喝了酒怎么办 一岁宝宝多动怎么办 3岁前儿童多动症怎么办 好动症的孩子该怎么办 18个月宝宝腹泻怎么办 8个月小孩发烧怎么办 八个月大宝宝发烧怎么办 8个月宝宝拉稀水怎么办 八个月宝宝38度怎么办 8个月的宝宝发烧怎么办 八个月大的宝宝拉肚子怎么办 9孩子上课坐不住怎么办 3岁宝宝太皮怎么办 4岁的宝宝多动症怎么办 小孩好动注意力不集中怎么办 乐扣加热变形了怎么办 3岁宝宝咳嗽厉害怎么办