|
|
|
| |
|
多线程验证DoubleCheckedLocking的线程安全 如果没有出现提示:"单件失败",就说明当前的测试是成功的, 先开了100条线程,不知道能不能说明问题 :)
实现方法(点击下载源码)
class CStaticThread : public CObject  
{//在类中作一个Static线程,每需要一个新线程,都需要new一下 
public: 
 DWORD GetThreadID() {return m_dwThreadID;} 
 BOOL RunThread(); 
 BOOL StopThread(DWORD dwThreadID); 
 static void SetEventRunTogether(BOOL bIn); 
private: 
 void SetThreadID(DWORD dwThreadID) {m_dwThreadID = dwThreadID;} 
 static DWORD WINAPI ThreadBuildIn(LPVOID lpArg); 
 virtual DWORD ThreadBuildIn(void); 
 void Clear(); 
 void SetFlag_Stop(BOOL bIn) {m_bStop = bIn;} 
 BOOL GetFlag_Stop() {return m_bStop;} 
 HANDLE GetEventRunTogether(); 
private: 
 DWORD m_dwThreadID;//自定义线程ID 
 BOOL m_bStop;//要求线程停止的标记(线程主动退出的依据) 
 HANDLE m_hThread;//线程句柄 
 HANDLE m_hevtThreadStop;//线程停止事件 
 static HANDLE m_hevtThreadRunTogether;//线程并发事件 
public: 
 CStaticThread(DWORD dwThreadID); 
 virtual ~CStaticThread();
}; 
 POSITION pos = m_ThreadList.GetHeadPosition();
 while(pos) 
 { 
  pThread = m_ThreadList.GetNext(pos); 
  pThread->RunThread(); 
 }
 CString csMsg = ""; 
 csMsg.Format("您在调试环境下看最后一条\"ThreadID XXX Run\"结束的时候,就可以按下并发测试了"); 
 //这里还要加个函数用来判断所有线程是否都在等并发事件才人性化 
 //改天加上,如果程序没有BUG的话,我想应该可以说明(关于Singleton的)问题了
 AfxMessageBox(csMsg); 
}
void CMainDlg::OnButton3() 
{ 
 if(AfxMessageBox("如果您已经按下了准备线程的按钮,并且得到了线程准备好的提示,请您按下\"确定\"进行并发测试线程安全", MB_OKCANCEL) == IDOK) 
 { 
  CStaticThread::SetEventRunTogether(TRUE); 
 } 
}
|
|
| |
|
|
|