自组织线程设计
在开发某业务系统过程中,遇到了多线程开发的问题。由于业务逻辑较为复杂,系统中使用了接近50个线程,它们有着不同的业务逻辑和线程执行函数(ProcFunction),所以无法通过for循环方式来创建。由于每个线程的创建、同步、退出/销毁等操作都需要外部手动控制,造成了代码的混乱和重复。为了避免上述问题,想到了设计一个自组织、功能完善的工作线程类WorkThread,它的骨干代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| class WorkThread { public: WorkThread() : m_hThread(NULL) { m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); } virtual ~WorkThread() { CloseHandle(m_hEvent); if (NULL != m_hThread) { CloseHandle(m_hThread); m_hThread = NULL; } } public: virtual BOOL Create() { DWORD dw; m_hThread = ::CreateThread(NULL, NULL, ProcFunction, this, NULL, &dw); return (NULL == m_hThread) ? FALSE : TRUE; } virtual BOOL Start(); virtual int Execute() = 0; virtual BOOL Pause(); virtual BOOL Resume(); virtual BOOL Terminate(); virtual BOOL Destroy(); BOOL IsActive(); BOOL IsExit(); protected: HANDLE m_hThread; HANDLE m_hEvent; private: static DWORD WINAPI ProcFunction(LPVOID lParam) { WorkThread* pThread = (WorkThread*)lParam; if(NULL == pThread) return -1; DWORD dw = pThread->Execute(); return dw; } };
|
设计问题
在上述代码的实现过程中,有下面一些疑问,具体包括:
- 工作线程类中采用何种方式进行同步较为便捷,例如互斥、事件、信号量或者是临界区?
- 如果想实现线程创建后暂不执行,应该如何实现?在MFC中可以通过AfxBeginThread()函数实现,但不知晓具体的实现方式。
- 在线程函数执行完毕后不自动销毁,因为要执行额外的清理操作,那么应该如何实现?