首页 > 其他 > 详细

理解 CWorkQueue

时间:2015-08-01 20:26:56      阅读:186      评论:0      收藏:0      [点我收藏+]

 以前做项目时,用过 Codeproject 上一个线程管理的代码 Work Queue[1],很好用,也是不错的学习资料,但对于多线程初学者也不是一眼就能看懂的,所以今天打算对这个代码做个解读笔记,可为其它学习者提供一个参考,也深化自己对多线程的理解。

这个多线程管理类为 CWorkQueue,使用的是生产者-消费者模式。CWorkQueue 创建的每个线程都是一个消费者,生产者是类成员 m_pWorkItemQueue。生产者资源由外界使用者通过 InsertWorkItem 成员函数注入,然后通过 ReleaseSemaphore 通知消费者(即线程)处理,消费者线程 ThreadFunc 自创建起始就一直在等待,等待生产者通知,接到有任务通知后,线程就执行任务,执行完毕后继续等待。

m_pWorkItemQueue = new WorkItemQueue(); //初始化工作队列

 

m_phSincObjectsArray[SEMAPHORE_INDEX] = CreateSemaphore(NULL,0,LONG_MAX,NULL); //创建Semaphore对象

 

m_phSincObjectsArray[ABORT_EVENT_INDEX] = CreateEvent(NULL,TRUE,FALSE,NULL); //创建event 事件对象

 

m_phThreads = new HANDLE[nNumberOfThreads]; //分配线程句柄数组

 

typedef struct _THREAD_CONTEXT
{
   CWorkQueue* pWorkQueue;
   void*       pThreadData;
} THREAD_CONTEXT,*PTHREAD_CONTEXT;

DWORD dwThreadId;
PTHREAD_CONTEXT pThreadsContext ;
 
//创建所有的线程
for(i = 0 ; i < nNumberOfThreads ; i++ )
{  
   //初始化每个线程的上下文,用于传递给线程函数
  pThreadsContext = new THREAD_CONTEXT;
  pThreadsContext->pWorkQueue  = this;
  pThreadsContext->pThreadData = ThreadData == NULL? NULL : ThreadData[i];       
  //创建线程
  m_phThreads[i] = CreateThread(NULL,
      0,
      CWorkQueue::ThreadFunc,
      pThreadsContext,
      0,
      &dwThreadId);

  if(m_phThreads[i] == NULL)
  {  
     delete pThreadsContext;
     m_nNumberOfThreads = i;
     Destroy();
     return false;
  }
}

 

 

参考资料:

1、http://www.codeproject.com/Articles/3607/Work-Queue

理解 CWorkQueue

原文:http://www.cnblogs.com/NaughtyBaby/p/4694536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!