现在的位置: 首页 > 综合 > 正文

用interlocked提醒线程任务结束

2013年09月14日 ⁄ 综合 ⁄ 共 563字 ⁄ 字号 评论关闭

///////也许已经火星了,估计这么简单已经有人写了,不过似乎没有百度到


有时候主线程需要通知一个在循环工作中的线程停止工作,或者退出,

Event或者同步对象来提醒,感觉每次循环速度太慢,正好看到了自旋锁,刚好可以用

你需要在你的工作线程中布置如下代码

DWORD thread_func(LPVOID stopWorkPack)
{
//C++中要const_cast才能把volatile属性移除,所以这里直接用C转换
 volatile long* stopWork=(volatile long*)(stopWorkPack);//这里就不要检查nullptr了。。麻烦
while(InterlockedExchange(stopWork,FALSE)==FALSE)
{//检测stopWork是否被设定为TRUE过,其实就和自旋锁一个道理

//TODO: Work Code

}
return 0;
} 

然后你想要结束这个线程的时候可以这么写

InterlockedExchange(stopWork,TRUE);

当工作线程调用InterlockedExchange的时候检测到函数的返回值为TRUE,自然就退出了

需要注意的是stopWork在线程返回以后一定为FALSE

效率很快,每一个Interlocked调用大约在50个指令左右,比同步对象要快多了

抱歉!评论已关闭.