社区
进程/线程/DLL
帖子详情
多线程的问题:为什么改一个BOOL量会失败?在线等
Kaile
2005-10-24 08:05:41
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。
请教,简捷的实现方法是什么?
谢谢。
...全文
225
13
打赏
收藏
多线程的问题:为什么改一个BOOL量会失败?在线等
一个线程对象正在跑,做一些科学计算工作,现在需要按一个按钮将这个对象的数据成员bExit由FALSE改为TRUE,以实现计算中断,结果发现没有任何效果。 请教,简捷的实现方法是什么? 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
用临界区吧
C++11特性:线程同步之互斥锁
进行
多线程
编程,如果多个线程需要对同一块内存进行操作,比如:同时读、同时写、同时读写对于后两种情况来说,如果不做任何的人为干涉就会出现各种各样的错误数据。这是因为线程在运行的时候需要先得到CPU时间片,时间片用完之后需要放弃已获得的CPU资源,就这样线程频繁地在就绪态和运行态之间切换,更复杂一点还可以在就绪态、运行态、挂起态之间切换,这样就会导致线程的执行顺序并不是有序的,而是随机的混乱的,就如同下图中的这个例子一样,理想很丰满现实却很残酷。:独占的互斥锁,不能递归使用。
C++
多线程
:原子类型(stdatomic)
atomic类型原子操作宣告C++11来到了
多线程
和并行编程的时代。相对于偏于底层的pthread库,C++通过定义原子类型的方式,轻松地化解了互斥访问共享数据的难题。不过C++也延续了其易于学习难于精通的特性,虽然atomic原子类型使用上较为简单,但其函数接口(原子操作)却可以有不用的内存顺序。C++11从各种不同的平台上抽象出了
一个
软件的内存模型,并以内存顺序进行描述,以使得想进一步挖掘并行系统性能的程序员有足够简单的手段来完成以往只能通过内联汇编来完成的工作。本文介绍的和。
谈谈C#
多线程
开发:并行、并发与异步编程
概述 现代程序开发过程中不可避免会使用到
多线程
相关的技术,之所以要使用
多线程
,主要原因或目的大致有以下几个: 1、 业务特性决定程序就是多任务的,比如,一边采集数据、一边分析数据、同时还要实时显示数据; 2、 在执行
一个
较长时间的任务时,不能阻塞UI界面响应,必须通过后台线程处理; 3、 在执行批量计算密集型任务时,采用
多线程
技术可以提高运行效率。 传统使用的
多线程
技术有: Thread & ThreadPool Timer BackgroundWorker 目前,这些技术都不再..
C++
多线程
02:互斥量(mutex)
由于它们额外的复杂性,读/写锁优于普通锁std::mutex的情况比较少见。但是理论上确实存在。如果在频繁但短暂的读取操作场景,读/写互斥不会提高性能。它更适合于读取操作频繁且耗时的场景。当读操作只是在内存数据结构中查找时,很可能简单的锁会胜过读/写锁。如果读取操作的开销非常大,并且您可以并行处理许多操作,那么在某些时候增加读写比率应该会导致读取/写入器性能优于排他锁的情况。断点在哪里取决于实际工作量。另请注意,在持有锁的同时执行耗时的操作通常是
一个
坏兆头。
C#
多线程
编程:线程锁与无锁并发
多线程
编程在现代软件开发中至关重要。本文将讨论 C# 中的
多线程
技术,重点介绍锁的概念,线程锁与无锁并发。通过学习本篇博文,我们将学会如何正确处理并发
问题
,提高程序的性能和稳定性。锁是一种同步机制,用于控制多个线程对共享资源的访问。当
一个
线程获得了锁时,其他线程将被阻塞,直到该线程释放了锁。本文深入探讨了 C# 中的
多线程
编程技术,重点介绍了锁的基本概念、线程锁的类型、锁的实现方式、无锁并发编程以及 C# 中的并发集合类和经典并发同步
问题
。理解
多线程
编程的基本概念。
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章