这段代码为什么不能在release下正常运行

appleshao 2009-04-27 05:58:58

///////////////////////////////////////////////////////////////
// CountErr.cpp文件


#include <stdio.h>
#include <windows.h>
#include <process.h>

int g_nCount1 = 0;
int g_nCount2 = 0;
BOOL g_bContinue = TRUE;

UINT __stdcall ThreadFunc(LPVOID);

int main(int argc, char* argv[])
{
UINT uId;
HANDLE h[2];

h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId);
h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId);


// 等待1秒后通知两个计数线程结束,关闭句柄
Sleep(1000);
g_bContinue = FALSE;
::WaitForMultipleObjects(2, h, TRUE, INFINITE);
::CloseHandle(h[0]);
::CloseHandle(h[1]);

printf("g_nCount1 = %d \n", g_nCount1);
printf("g_nCount2 = %d \n", g_nCount2);

return 0;
}

UINT __stdcall ThreadFunc(LPVOID)
{
while(g_bContinue)
{
g_nCount1++;
g_nCount2++;
}
return 0;
}

//本人一直没有用过release模式编译程序过,一编译居然发现有问题.来求教
...全文
155 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
MMMoonriver 2009-04-27
  • 打赏
  • 举报
回复
学习中
appleshao 2009-04-27
  • 打赏
  • 举报
回复
我在研究中等下来结贴
goodname 2009-04-27
  • 打赏
  • 举报
回复
之所以没有输出主要还是因为你的线程总是没有返回,所以
你的
WaitForMultipleObjects
一直被阻塞,你可以设个超时时间。
goodname 2009-04-27
  • 打赏
  • 举报
回复
那我同意9楼的说法

可以使用
volatile BOOL g_bContinue = TRUE;
appleshao 2009-04-27
  • 打赏
  • 举报
回复
啊啊啊........
appleshao 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wl_99888 的回复:]
可能和高速缓存有关,你建议你查下 < <windows via c/c++>>里面有关内存的章节.试试在g_bContinue前加关键字violate.
可能的情况是:
全局变量g_bContinue访问的时候被载入高速缓存,你那两个线程以后访问变量都是在高速缓存中读取的.
你的主线程将g_bContinue改为TRUE后,高速缓存中的g_bContinue没有变
至于为什么DEBUG模式下没事,可能原因是DEBUG模式下对数据检查更严格吧.
[/Quote]

加了volatile关键字以后果然可以运行了..
「已注销」 2009-04-27
  • 打赏
  • 举报
回复
只要注意线程同步,则不可能存在Debug可运行,Release不行。
appleshao 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 goodname 的回复:]
编译有什么问题,请贴上来诊断下。
[/Quote]

在发行版编译下,没有输出语句.在debug版的就有.
  • 打赏
  • 举报
回复
UINT __stdcall ThreadFunc(LPVOID)
{
while(g_bContinue)
{
g_nCount1++; //全局变量,且不带锁
g_nCount2++;
}
return 0;
}


你的线程函数本身不是可重入的,且不用锁,也不能保证线程安全,最后你又在2个线程里使用了它,彻底违背了线程安全的原则,你还希望代码跑的顺利么?
wl_99888 2009-04-27
  • 打赏
  • 举报
回复
线程同步建议还是用系统提供的内核对象来处理,在逻辑和实现上都是比较好的选择.
wl_99888 2009-04-27
  • 打赏
  • 举报
回复
可能和高速缓存有关,你建议你查下<<windows via c/c++>>里面有关内存的章节.试试在g_bContinue前加关键字violate.
可能的情况是:
全局变量g_bContinue访问的时候被载入高速缓存,你那两个线程以后访问变量都是在高速缓存中读取的.
你的主线程将g_bContinue改为TRUE后,高速缓存中的g_bContinue没有变
至于为什么DEBUG模式下没事,可能原因是DEBUG模式下对数据检查更严格吧.
goodname 2009-04-27
  • 打赏
  • 举报
回复
编译有什么问题,请贴上来诊断下。
appleshao 2009-04-27
  • 打赏
  • 举报
回复
刚才的贴和现在的这个贴问题好像不一样啊亲爱的arong1234哥
appleshao 2009-04-27
  • 打赏
  • 举报
回复
并发控制那就不是我的错了,我刚看win32,里面没有并发控制介绍.呵呵
appleshao 2009-04-27
  • 打赏
  • 举报
回复
那个我明白了,刚才不在不好意思,不过这个问题和那个问题好像不一样吧,你仔细看看代码2个是不同的代码,这个即便枪线运行了,也没存在问题啊.

在debug下好好的,在release下就不行.

那个贴我已经结了
ysysbaobei 2009-04-27
  • 打赏
  • 举报
回复
arong1234 2009-04-27
  • 打赏
  • 举报
回复
另外一贴不是已经告诉你了?你帖子也不看全
[Quote=引用 2 楼 appleshao 的回复:]
敢问老大如何解决这个问题
[/Quote]
appleshao 2009-04-27
  • 打赏
  • 举报
回复
敢问老大如何解决这个问题
arong1234 2009-04-27
  • 打赏
  • 举报
回复
除了在你另问的一贴中的回答外:
http://topic.csdn.net/u/20090427/06/ec6fab36-d57f-447e-a637-f21d213b1bb3.html
release模式下程序运行速度更快,因此子线程抢的几率更高。多线程程序是和速度有密切关系的程序,因此有些现象只有在不调试的状态才出现

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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