gpt4 book ai didi

c++ - 与 std::vector<>::size() 并发

转载 作者:行者123 更新时间:2023-11-30 01:46:07 25 4
gpt4 key购买 nike

此代码挂起(请注意,仅在发布版本中)并且必须手动终止:

#include <Windows.h>
#include <vector>
#include <thread>

int main()
{
std::vector<int> vec;
vec.push_back( 0 );
std::thread( [&vec]()
{
Sleep( 150 );
vec.pop_back();
} ).detach();
while( vec.size() > 0 );
return 0;
}

而这段代码自然终止:

#include <Windows.h>
#include <vector>
#include <thread>

int main()
{
std::vector<int> vec;
vec.push_back( 0 );
std::thread( [&vec]()
{
Sleep( 150 );
vec.pop_back();
} ).detach();
while( vec.size() > 0 )
{
Sleep( 1 );
}
return 0;
}

似乎连续发送std::vector<int>::size() 的垃圾邮件以某种方式阻止执行,但是如何以及为什么?为什么只在发布版本中?

(使用 VC2013 构建,如果这是一个因素。)

最佳答案

最可能的解释是优化器改变了循环:

while (vec.size() > 0);

进入

reg = vec.size(); while(reg > 0);

...将 vec.size() 中的值加载到一个寄存器中,然后从那里读取它,因为循环中没有任何内容表明可能导致该值的内存屏障多变。

当您在循环中调用 Sleep 时,该调用涉及溢出寄存器,因此将值保存在寄存器中没有任何好处,因此未完成。

关于c++ - 与 std::vector<>::size() 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com