2
標題說明了一切:)在VS2013中std :: this_thread :: get_id()可靠嗎?
#include <thread>
#include <cstdio>
int main()
{
std::thread threads[2];
for (int i = 0; i < 2; ++i)
{
threads[i] = std::thread([&]()
{
printf("thread id = %x\n", std::this_thread::get_id());
printf("thread id = %x\n", std::this_thread::get_id());
});
}
for (auto& it : threads)
{
it.join();
}
return 0;
}
當編譯和使用GCC和Clang的我已(我的)期望的結果,4個消息有2個不同的值,在一些隨機的順序打印運行它。當使用VS2013時,我有4條消息(按預期),但有4個不同的值!
我在這裏做錯了什麼或編譯器/ MS線程庫嗎?
編輯:正如Tony D指出的那樣,問題似乎是我認爲thread :: id是int的地方。接下來的代碼按預期工作:
#include <thread>
#include <cassert>
int main()
{
std::thread threads[2];
for (int i = 0; i < 2; ++i)
{
threads[i] = std::thread([&]()
{
std::thread::id id1 = std::this_thread::get_id();
std::thread::id id2 = std::this_thread::get_id();
assert(id1 == id2);
});
}
for (auto& it : threads)
{
it.join();
}
return 0;
}
它可能與輸出流周圍的同步有關。爲什麼不嘗試將兩次調用的ID保存到變量中,然後*打印它們,或者等價地讓一個printf打印兩個調用結果? (當然有一個競爭條件,但你會期望它很少被移到另一個線程)。 –
operator <<應該被重載,所以使用'std :: cout'而不是printf – nos