多线程退出可以用int变量作标记吗
多线程退出可以用int变量做标记吗?
刚才看Win32多线程程序设计时,他说线程退出的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。然后他建立了个事件,周期性地检查一个event对象。事件如果激活了就return。我想问为什么不用一个int变量来做标记呀?int变量变为1了线程就退出。这样可以吗??
------最佳解决方案--------------------
以前看Java的时候,曾看到在大规模并发的时候,利用CPU的一个什么特性(类似spinlock),用busy loop更加高效...
------其他解决方案--------------------
可以~
------其他解决方案--------------------
event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)
------其他解决方案--------------------
自己逻辑控制好了,用int更好用.
------其他解决方案--------------------
绝对可以,实时性要求不高时间,可以用的
if(g_flag)
return 0;
else
Sleep(10);
------其他解决方案--------------------
if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)
这样就是在堵塞
------其他解决方案--------------------
回复于: 2012-12-04 10:06:10
event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)
------其他解决方案--------------------
if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)
{
printf("Received request to terminate\n");
return (DWORD)-1;
}
书上这样做也没有堵塞呀。而且我以为不需要堵塞,只不过是线程每次运行到那的时候检查一下,能退出就return了,不能退出就接着执行。
例如 if(i == 1)
return;
不等于1就接着执行。
至于“要保证读取int的数据完整”,我就是要在他退出的时候再别的线程里让 i = 1,就行了。就算切换时间片了的话下回运行的话也可以的吧。
------其他解决方案--------------------
应该不需要加锁吧,我在work线程里就是让他检验一下,
if(i == 1)
return;
也不对i进行赋值什么的操作。只在主线程想让他退出的时候才对i进行i=1的操作;
------其他解决方案--------------------
如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。
不是立即返回码?
那就算他是阻塞了,我就像问问
if(i==1)
return;
这样为什么不好呀!?
------其他解决方案--------------------
int赋值不是atom操作,操作的时候,CPU可以进行线程调度,虽然可能性不大。如果用_asm还可以说的过去。
当然这也不是一成不变的,检查int在有些时候可能还更好。
------其他解决方案--------------------
我想问问什么时候不好,就是没有想到不好地方,但感觉好像又不太好。纠结了!
------其他解决方案--------------------
刚才看Win32多线程程序设计时,他说线程退出的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。然后他建立了个事件,周期性地检查一个event对象。事件如果激活了就return。我想问为什么不用一个int变量来做标记呀?int变量变为1了线程就退出。这样可以吗??
------最佳解决方案--------------------
以前看Java的时候,曾看到在大规模并发的时候,利用CPU的一个什么特性(类似spinlock),用busy loop更加高效...
------其他解决方案--------------------
可以~
------其他解决方案--------------------
event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)
------其他解决方案--------------------
自己逻辑控制好了,用int更好用.
------其他解决方案--------------------
绝对可以,实时性要求不高时间,可以用的
if(g_flag)
return 0;
else
Sleep(10);
------其他解决方案--------------------
if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)
这样就是在堵塞
------其他解决方案--------------------
回复于: 2012-12-04 10:06:10
event可以阻塞,int一定要busy while,CPU负担加重,而且还要保证读取int的数据完整(加锁)
------其他解决方案--------------------
if(WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)
{
printf("Received request to terminate\n");
return (DWORD)-1;
}
书上这样做也没有堵塞呀。而且我以为不需要堵塞,只不过是线程每次运行到那的时候检查一下,能退出就return了,不能退出就接着执行。
例如 if(i == 1)
return;
不等于1就接着执行。
至于“要保证读取int的数据完整”,我就是要在他退出的时候再别的线程里让 i = 1,就行了。就算切换时间片了的话下回运行的话也可以的吧。
------其他解决方案--------------------
应该不需要加锁吧,我在work线程里就是让他检验一下,
if(i == 1)
return;
也不对i进行赋值什么的操作。只在主线程想让他退出的时候才对i进行i=1的操作;
------其他解决方案--------------------
如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。
不是立即返回码?
那就算他是阻塞了,我就像问问
if(i==1)
return;
这样为什么不好呀!?
------其他解决方案--------------------
int赋值不是atom操作,操作的时候,CPU可以进行线程调度,虽然可能性不大。如果用_asm还可以说的过去。
当然这也不是一成不变的,检查int在有些时候可能还更好。
------其他解决方案--------------------
我想问问什么时候不好,就是没有想到不好地方,但感觉好像又不太好。纠结了!
------其他解决方案--------------------