码迷,mamicode.com
首页 > 其他好文 > 详细

理解 CWorkQueue

时间:2015-08-01 20:27:05      阅读:124      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!