C++ 不';t在释放模式下正确执行相等操作

C++ 不';t在释放模式下正确执行相等操作,c++,visual-c++,visual-studio-2015,C++,Visual C++,Visual Studio 2015,我正在使用VS2015 在调试模式下,循环正常工作时高亮显示-当时!P_对象->第一个_请求为真,它会中断。 但同样的条件在发布模式下不起作用。此外,在quickwatch中,您可以看到visual studio quickwatch可以识别!P_Object->first_request为false,但循环继续重复 顺便说一句:p\u Object->first\u request变量在类中初始化为false,在线程中更改为true(此信息可能有用-idk) 如何修复此错误 DEBUG Co

我正在使用VS2015

在调试模式下,循环正常工作时高亮显示-当
时!P_对象->第一个_请求
为真,它会中断。
但同样的条件在发布模式下不起作用。此外,在quickwatch中,您可以看到visual studio quickwatch可以识别
!P_Object->first_request
为false,但循环继续重复

顺便说一句:
p\u Object->first\u request
变量在类中初始化为false,在线程中更改为true(此信息可能有用-idk)

如何修复此错误

DEBUG Command line - "/GS /analyze- /W3 /Zc:wchar_t /I"C:\boost_1_62_0" /ZI /Gm /Od /Fd"Debug\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEAN_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MTd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\ExpenditureAndReceipts.pch"";

RELEASE Command line - "/GS /analyze- /W3 /Gy /Zc:wchar_t /I"C:\boost_1_62_0" /Zi /Gm- /O2 /Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEANNDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\ExpenditureAndReceipts.pch"";

本质上,一个只发布的bug必须像其他bug一样被处理,除非你没有机器来帮助你。 将应用程序简化为“Hello World”-这会提供一些输出,并在没有错误的情况下关闭。然后将整个应用程序放回,并添加一个切换,这样您就可以在无缺陷的“Hello world”版本和有缺陷的版本之间切换,只需几次按键

现在,在Hello World版本中添加功能,并将其从完整版本中删除(当然,保留完整版本)。尝试隔离出现错误的点,以便只需几下按键,就可以在无错误、轻微受损和有错误的版本之间切换

这通常会暴露出错误。如果没有,就开始使用这些信息来输入诊断printf(启动调试控制台并运行,以便可以看到stdout)


Release zero初始化使用malloc()分配的内存,断言不同,还有许多其他小更改。出现仅限发布的错误并不少见,尽管这当然会使调试模式变得毫无意义。

本质上,仅限发布的错误必须像任何其他错误一样处理,除非您没有任何机器来帮助您。 将应用程序简化为“Hello World”——这会提供一点输出,并在没有错误的情况下关闭。然后将整个应用程序放回,并添加一个切换,这样您就可以在无缺陷的“Hello World”版本和有缺陷的版本之间切换,只需几下按键

现在将功能添加到Hello World版本,并将其从完整版本中删除(当然,保留完整版本)。试着隔离bug出现的位置,这样你就可以在一个没有bug的、稍微有缺陷的版本和一个有bug的版本之间切换,只需几下键盘

这经常暴露出错误。如果没有,则开始使用该信息放入诊断printf(启动并运行调试控制台,以便可以看到stdout)


Release zero初始化分配给malloc()的内存,断言不同,还有许多其他小更改。有一个只发布版本的bug并不少见,当然这会使调试模式变得毫无意义。

您不能在一个线程中读取bool,然后在另一个线程中写入它。编译器可以在第一个线程中自由缓存读取的内容,并且从不读取内存更改

如果您正在编写多线程编程,请通过原子和互斥体等进行通信

std::atomic
替换
first\u请求。这可能需要更改其他代码。完成后,事情应该是好的


您所做的(在一个线程中读取,在另一个线程中写入,没有同步)是未定义的行为。未定义的行为并不总是崩溃,它有时只会导致发布版本没有意义。

您无法在一个线程中读取bool并在另一个线程中写入它。编译器可以在第一个线程中自由缓存读取的内容,并且从不读取内存更改

如果您正在编写多线程编程,请通过原子和互斥体等进行通信

std::atomic
替换
first\u请求。这可能需要更改其他代码。完成后,事情应该是好的


您所做的(在一个线程中读取,在另一个线程中写入,没有同步)是未定义的行为。未定义的行为并不总是崩溃,它有时只会导致发布版本没有意义。

我猜它已经被优化了,因为循环没有任何作用。您可能希望标记变量
volatile
,告诉编译器不要优化它的使用。您需要使用适当的线程间同步(不仅仅是在变量上敲击
volatile
)。使用原子数据类型、临界区、互斥或任何合适的。要将我在上一篇评论中提出的观点和@MichaelBurr的观点整合到一条评论中:优化问题可以用
volatile
解决,但它不是线程同步关键字。您仍然需要对作为旁注,不要使用忙等待循环。一个更好的解决方案可能是类似条件变量的东西(并且可以解决这两个问题)。就像上面评论中提到的@pm100一样,问题是编译器优化了循环,因为它是空的。Thx!我猜它已经优化了,因为循环没有任何功能。您可能希望标记变量
volatile
,以告知编译器不要优化它的使用。您需要使用适当的线程间同步(不仅仅是在变量上敲击
volatile
)。使用原子数据类型、临界区、互斥或任何合适的。要将我在上一篇评论中提出的观点和@MichaelBurr的观点整合到一条评论中:优化问题可以用
volatile
解决,但它不是线程同步关键字。您仍然需要对作为旁注,不要使用忙等待循环。一个更好的解决方案可能是类似条件变量的东西(并且可以解决这两个问题)。就像上面评论中提到的@pm100一样,问题是编译器优化了循环,因为它是空的。Thx!没有只发布的bug,只有显示不同的bug(更严重的是)在发布模式下。没有只发布的bug,只有发布的bug