在MFC中用继承CWinThread类起的线程,在不同线程中用到同一个变量

Leo头很大 2019-09-03 02:15:43
如题,在一个文件中定义的全局变量 BOOL flag;在线程CPP中extern BOOL flag声明了这个变量,这个变量会在新的线程中作为判断标志位,在定义该变量的文件代码段会修改这个变量的值,目前工程项目使用没出现问题,想问问有可能会出现哪些问题?
...全文
143 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-09-04
  • 打赏
  • 举报
回复
建议精读《Windows核心编程》
Leo头很大 2019-09-04
  • 打赏
  • 举报
回复
突然发现,我搞错了,当我在一个线程中对标志位赋值时不需要加锁,需要加锁的是在一个函数体中,要读又要写所以在
			WaitForSingleObject(hMutex1,INFINITE);
if(!bIsConnect)
{
...//对bIsConnect赋值的语句在此

}
ReleaseMutex(hMutex1);


不知道自己的理解对了没
Leo头很大 2019-09-04
  • 打赏
  • 举报
回复
在网上搜索原子操作后,除了atomic,还找到了只要包含windows.h头文件就可以使用的Interlocked函数,同样可以实现原子操作。
在需要对标志位进行修改的地方用以下代码:

InterlockedExchange(&bIsConnect,0);

Leo头很大 2019-09-04
  • 打赏
  • 举报
回复
去学习了下原子操作,发现比起对用到变量的地方加锁,直接将变量声明为原子操作变量更加方便省心,实为惊喜。
但是当我将atomic的头文件#include <atomic>添加到代码里时,竟然显示找不到文件,这让我想起之前#include<mutex>这个头文件时
也是不找不到文件。
我的用的是VS2010。尝试着用VS2013包含该头文件还是找不到,这个头文件需要自己下载添加到路径吗?
Leo头很大 2019-09-04
  • 打赏
  • 举报
回复
谢谢哦
gouyanfen 2019-09-03
  • 打赏
  • 举报
回复
引用 2 楼 Leo头很大 的回复:
我的加锁代码如下,总感觉太简单有问题

				WaitForSingleObject(hMutex1,INFINITE);
				if(!bIsConnect)
				{
					ReleaseMutex(hMutex1);
bIsConnect就是在另一个文件声明定义的BOOL标志位
如果可以保证bIsConnect改变的时候是原子操作就没有问题
Leo头很大 2019-09-03
  • 打赏
  • 举报
回复
我的加锁代码如下,总感觉太简单有问题

WaitForSingleObject(hMutex1,INFINITE);
if(!bIsConnect)
{
ReleaseMutex(hMutex1);

bIsConnect就是在另一个文件声明定义的BOOL标志位
赵4老师 2019-09-03
  • 打赏
  • 举报
回复
多线程该加锁的地方要加锁。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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