首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这种形式退出线程有bug吗

2013-03-06 
这种方式退出线程有bug吗?全局变量static bool bflagtrue子线程{while(bflag){do...something}}主线程:v

这种方式退出线程有bug吗?

全局变量
static bool bflag=true;

子线程
{

while(bflag)
{

do...something

}

}

主线程:
void CXXDlg::OnExit()
{
bflag=flase;

Sleep(50);

}

深知 可以用event来退出子线程的! 但是我就不相信,为什么用全局bool标识的法子 阿里退出就有漏洞?



[解决办法]
可能 do...something的时间有些长。
[解决办法]
不能确保子线程的执行时间,你可以试着让子线程什么都不做,空着;试一下就会知道是可以的!
[解决办法]
do something 如果需要100ms
你只Sleep(50);
程序退出而线程没有安全退出呗!

用全局也行但你要知道你do something的上限时间,才能保证安全退出。
[解决办法]

DWORD WINAPI WaitForSingleObject(
  __in          HANDLE hHandle,
  __in          DWORD dwMilliseconds
);

dwMilliseconds 
The time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.


[解决办法]
存在主内存,与工作内存的概念:
每个线程为了效率都会有自己的工作内存,这个工作内存是对主内存的拷贝,所以数据可能是不同步的!所以直接使用全局变量是不能保证同步。
使用volatile关键字可以保证主内存与工作内存中的数据保持一致

热点排行