次のコードをコンパイルすると
#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 ビット コンパイラでは、両方のバージョンで 3 秒かかります。ただし、32 ビット コンパイラを使用すると、問題が残ります (これは、リリース バージョンとデバッグ バージョンの混乱によるものではありません)。