社区
进程/线程/DLL
帖子详情
多线程的问题:为什么改一个BOOL量会失败?在线等
Kaile
2005-10-24 08:05:41
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。
请教,简捷的实现方法是什么?
谢谢。
...全文
257
13
打赏
收藏
多线程的问题:为什么改一个BOOL量会失败?在线等
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。 请教,简捷的实现方法是什么? 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bm1408
2005-10-25
打赏
举报
回复
你要重载消息处理的函数了,
我以前也遇到一个这样的问题,实在搞不定,我来
goodname008
2005-10-25
打赏
举报
回复
无论你在任何地方修改 bContinue 变量的值,都要做好线程同步,切记切记。
不然程序复杂了以后会很难排查错误。
Kaile
2005-10-25
打赏
举报
回复
感谢,发现是我的问题,我还有另外一个地方在SetExitFlag(TRUE)以后又将它变为FALSE,因为是多线程,改了以后没发现,以为是没修改成功。
上面的代码很好,学习。
goodname008
2005-10-25
打赏
举报
回复
而我个人比较推荐这种作法:
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std;
HANDLE hEvent = NULL;
BOOL bContinue = TRUE;
unsigned int __stdcall ThreadProc(LPVOID lpParameter)
{
while (true)
{
if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
{
break;
}
Sleep(100);
}
cout << "Thread terminated." << endl;
return 0;
}
int main(int argc, char* argv[])
{
hEvent = CreateEvent(NULL, TRUE, FALSE, "TestEvent");
UINT nThreadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &nThreadID);
int nInput = 0;
cin >> nInput;
if (nInput == 1)
{
SetEvent(hEvent);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
if (hEvent)
{
CloseHandle(hEvent);
hEvent = NULL;
}
return 0;
}
goodname008
2005-10-25
打赏
举报
回复
输入1可以使ThreadProc线程结束。
否则主线程将会被ThreadProc永远阻塞住。
goodname008
2005-10-25
打赏
举报
回复
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std;
CRITICAL_SECTION cs;
BOOL bContinue = TRUE;
unsigned int __stdcall ThreadProc(LPVOID lpParameter)
{
while (true)
{
EnterCriticalSection(&cs);
if (!bContinue)
{
break;
}
LeaveCriticalSection(&cs);
Sleep(100);
}
cout << "Thread terminated." << endl;
return 0;
}
int main(int argc, char* argv[])
{
InitializeCriticalSection(&cs);
UINT nThreadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &nThreadID);
int nInput = 0;
cin >> nInput;
if (nInput == 1)
{
EnterCriticalSection(&cs);
bContinue = FALSE;
LeaveCriticalSection(&cs);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
DeleteCriticalSection(&cs);
return 0;
}
peiming_ge
2005-10-25
打赏
举报
回复
在改变标志前先把线程对象挂起,试试
CWinThread* pCalc
....
main::SetExitFlag()
{
pCalc->SuspendThread()
pCalc->m_bExit = TRUE;
pCalc->ResumeThread();
}
皮皮鲁
2005-10-24
打赏
举报
回复
应该不大会的
可能是因为SetExitFlag在测试if ( isTimeOut() || m_bExit )之后运行
请确保在测试之前,已经调用了SetExitFlag
Kaile
2005-10-24
打赏
举报
回复
不行啊,大哥,我加了volatile,发现还是没改过来。
这样定义:
volatile BOOL m_bExit ;
这是调用对象的方法来修改这个标志
CalcInstance.SetExitFlag(TRUE);
void Calc::SetExitFlag(BOOL bExit)
{
m_bExit = bExit;
}
在计算内部加
if ( isTimeOut() || m_bExit )
return ;
加断点,发现m_bExit仍然是FALSE
oyljerry
2005-10-24
打赏
举报
回复
用volatile 修饰,防止编译器作优化
然后线程中通过bCondition来跳出循环
ming6424
2005-10-24
打赏
举报
回复
同意楼上的!!!
皮皮鲁
2005-10-24
打赏
举报
回复
最简单的方法就是在你这个BOOL变量的定义前面加上volatile
如:
volatile BOOL bCondition;
gunney
2005-10-24
打赏
举报
回复
用临界区吧
python中对于
bool
布尔值的取反
在处理批量更新数据库的脚本中,遇到因网络
问题
导致的请求
失败
,为避免手动转换key,实现了
一个
自动转换的机制。通过
bool
值的取反实现这一功能,如`a =
bool
(1 - b)`,每次请求前后
改
变
bool
变量的状态。这种操作适用于有规律的变量修
改
,贯彻自动化原则。
std::atomic_
bool
详解
文章介绍了C++11中std::atomic_
bool
用于在
多线程
环境下安全操作布尔值的方法,强调了std::atomic<
bool
>的使用推荐,并提供了原子操作、初始化和示例的详细说明,以确保线程间的同步和数据一致性。
windows C++
多线程
(八):互斥量mutex的使用
本文介绍了Windows C++中互斥量(mutex)的使用,包括创建、等待、执行保护代码、释放及关闭互斥量句柄。通过CreateMutex API创建互斥量,并探讨了其参数意义。同时,提到了在卖火车票场景中如何利用mutex避免并发
问题
。还对比了Win32 mutex与Qt、MFC中mutex的不同,指出后两者提供了lock和unlock方法,使用更为简便。
[
一个
经典的
多线程
同步
问题
]解决方案三:互斥量Mutex
本文介绍互斥量的概念及使用方法,包括创建、打开、触发和清理互斥量的函数。并通过实例演示如何利用互斥量解决
多线程
访问资源的
问题
,同时探讨其
在线
程同步中的应用。
C++
多线程
同步之Mutex(互斥量)
本文介绍了C++中Mutex在Win32和Linux平台上的使用,包括初始化、死锁避免及
多线程
同步的实践。通过示例展示了Mutex在Windows下防止打印混乱的效果,并探讨了线程死锁的原因与处理。同时,讨论了Mutex的持有时间对
多线程
效率的影响。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章