标签:
以前做项目时,用过 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
标签:
原文地址:http://www.cnblogs.com/NaughtyBaby/p/4694536.html