首页
社区
课程
招聘
[已解决] [求助]超级简单的问题。这个messageBox为啥不执行? 50.00雪花
发表于: 2021-6-14 00:06 4339

[已解决] [求助]超级简单的问题。这个messageBox为啥不执行? 50.00雪花

2021-6-14 00:06
4339

bool testBz = false;
UINT testThread1(LPVOID para)
{

1
2
3
4
5
6
7
8
9
10
11
while (1)
{
    if (testBz)
    {
        MessageBoxA(0, "as", "cc", 0);
        testBz = false;
    }
 
    //    Sleep(1);
}
return 2;

}
UINT testThread2(LPVOID para)
{
while (1)
{
testBz = true;
Sleep(1000);
}
return 2;
}
随便在哪个地方让他们跑起来
CreateThread(0,0,(LPTHREAD_START_ROUTINE)testThread1, NULL,0,0);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)testThread2, NULL, 0, 0);
奇怪的是testThread1里的MessageBox永远不会被执行到 理论上应该是一秒会弹出一次 百思不得其解。随后打开OD逆向 发现线程1里只会取一次testBz的值。以后都是无限循环判断 ax的值是否为1 根本不去给ax赋值。如果加上Sleep(1)或者加上其它一些任何对环境有所改变的代码就会正常执行messagebox。这是什么原因?你们电脑能否正常执行。还是我电脑中毒了?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 5291
活跃值: (4768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
估计是卡死了,延迟调大点试试
2021-6-14 09:22
0
雪    币: 5291
活跃值: (4768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
建议用互斥提或者事件或者许可证 
2021-6-14 09:23
0
雪    币: 246
活跃值: (4427)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4

 bool volatile testBz = false;

你这个代码不加Sleep(1)的话执行次数太多,用变量太频繁,怕吃性能,编译器会给你优化到寄存器,总之就是volatile的作用就是防止这种事情的

最后于 2021-6-14 09:39 被ookkaa编辑 ,原因:
2021-6-14 09:38
0
雪    币: 246
活跃值: (4427)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
atomic<bool> 也可以,本质就是加锁,跟上面那个不一样
2021-6-14 09:43
0
雪    币: 5291
活跃值: (4768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

给你改好了!

上传的附件:
2021-6-14 09:53
0
游客
登录 | 注册 方可回帖
返回
//