编译以下代码时
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <mutex>
std::mutex cout_mut;
void task()
{
for(int i=0; i<10; i++)
{
double d=0.0;
for(size_t cnt=0; cnt<200000000; cnt++) d += 1.23456;
std::lock_guard<std::mutex> lg(cout_mut);
std::cout << d << "(Help)" << std::endl;
// std::cout << "(Help)" << d << std::endl;
}
}
int main()
{
std::vector<std::thread> all_t(std::thread::hardware_concurrency());
auto t_begin = std::chrono::high_resolution_clock::now();
for(auto& t : all_t) t = std::thread{task};
for(auto& t : all_t) t.join();
auto t_end = std::chrono::high_resolution_clock::now();
std::cout << "Took : " << (t_end - t_begin).count() << std::endl;
}
在 MinGW 4.8.1 下,在我的盒子上执行大约需要 2.5 秒。这大约是仅task
单线程执行函数所需的时间。
但是,当我取消注释中间的行并因此注释掉之前的行时(即,当我交换d
和"(Help)"
写入的顺序时std::cout
)整个事情现在需要 8-9 秒。
解释是什么?
我再次测试,发现我只有 MinGW-build 的问题,x32-4.8.1-win32-dwarf-rev3
但没有 MinGW build的问题x64-4.8.1-posix-seh-rev3
。我有一台 64 位的机器。使用 64 位编译器,两个版本都需要三秒钟。但是,使用 32 位编译器,问题仍然存在(并且不是由于发布/调试版本混淆)。