线程中循环的问题

icper 2005-11-09 12:00:18
我有一个全局bool变量b
程序运行时开一个线程,线程中有个循环
while(!b)
{}
结果当b在别的流程中置为true时
线程有时候仍在那个while中出不来
release下必出现这个情况
debug的则没有这个问题

后来我在while循环中加了sleep(0)之后
解决了release的问题

我就想知道为什么会这样??
以前这样类似的用过,却没有见过这样的....
...全文
179 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluekite 2005-11-10
  • 打赏
  • 举报
回复
請看以下貼子中我的回答,個案相同:

线程疑问
http://community.csdn.net/Expert/topic/4382/4382522.xml?temp=.5482141
Featured 2005-11-10
  • 打赏
  • 举报
回复
是的。对变量的取值不是原子操作,非常危险。
lianglp 2005-11-10
  • 打赏
  • 举报
回复
如用变量控制,定义变量应:volatile bool b;
建议用1楼的建议。
gohappy_1999 2005-11-10
  • 打赏
  • 举报
回复
我觉得应该是楼主的误判,单就楼主的那段代码,在别的线程中置b = TRUE;假如这两个线程的优先级是一样的话,完全可以控制循环退出,只是一个时间的问题(即使循环所处的线程的优先级高于改变B的值的线程我觉得也应该是可以退出的).
你多等一会,线程应该是退出了的。

czg516 2005-11-10
  • 打赏
  • 举报
回复
好奇怪
icper 2005-11-10
  • 打赏
  • 举报
回复
多等一会也不行,除非退出程序

Featured:我知道,不过我的线程中只是判断该变量,
即使不同步也没关系

其实类似的问题还有一个
在窗口上一个按钮,点击后开始循环干活,在循环过程中开一个
线程,线程在做自己的活,然后在前面主循环工作到某阶段要弹出
对话框(afxmessagebox)时,可是就弹不出来,主循环也停在那了。
但是只要在线程的循环中加上sleep(0)就可以了。。。。。
这个对话框和线程是没有关系的。

Kudeet 2005-11-09
  • 打赏
  • 举报
回复
一般不建议用BOOL量控制循环

HANDLE g_hEvent;
int WINAPI WinMain(...)
{
//Create the manual-reset, nonsignaled event.
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
//Spawn 1 new threads.
HANDLE hThread;
DWORD dwThreadID;
hThread = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
//Allow thread to access the memory.
SetEvent(g_hEvent); //Set后WaitForSingleObject才返回
...
}

DWORD WINAPI WordCount(PVOID pvParam)
{
WaitForSingleObject(g_hEvent, INFINITE);
...
return(0);
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧