目前位置: VCer资源中心 >>> VCer开源 >>> 网络工具

[本帖已阅读2176次 分值110 回复1次] 张贴资源 发回信箱 控制面板

多线程验证DoubleCheckedLocking的线程安全

提供者:LoseSpeed 张贴时间:2006-05-11 03:41:29.0 出处:vcer.net 作者:不祥

多线程验证DoubleCheckedLocking的线程安全(2006-05-11 03:41:29.0)


LoseSpeed


 
级别: VCer小兵
头衔: VCer会员

经验: 314
作品: 4
分会: 华北分会
注册: 2004-12-27 23:34:59.0
登录: 2006-05-24 10:56:22.0
工程源码[68,445字节] 下载130

实现方法

如果没有出现提示:"单件失败",就说明当前的测试是成功的,

先开了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);

 }

}

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/4797.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 100% (1 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)

 


re:多线程验证DoubleCheckedLocking的线程安全
可以考虑让每个线程休息n毫秒再干活 这个n是个随机数,再测测看! BTW:你的代码部分可以用编辑器里面的“代码”格式,这样就会自动保留缩进得格式~

bluejoe 于 2006-05-14 16:47:17.0 编辑 [回复该贴]