2014-03-06 76 views
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; 
} 
+0

它可能與輸出流周圍的同步有關。爲什麼不嘗試將兩次調用的ID保存到變量中,然後*打印它們,或者等價地讓一個printf打印兩個調用結果? (當然有一個競爭條件,但你會期望它很少被移到另一個線程)。 –

+1

operator <<應該被重載,所以使用'std :: cout'而不是printf – nos

回答

4

你強迫std::thread::idint。使用std::cout寫入標準輸出而不是printf。並使用同步對象的某種:

std::mutex display_mutex; 

int main() 
{ 
    std::thread threads[2]; 

    for (int i = 0; i < 2; ++i) 
    { 
     threads[i] = std::thread([&]() 
     { 
      std::unique_lock<std::mutex> display_lock(display_mutex); 
      std::cout << "thread id = " << std::this_thread::get_id() << "\n"; 
      std::cout << "thread id = " << std::this_thread::get_id() << "\n"; 
     }); 
    } 

    for (auto& it : threads) 
    { 
     it.join(); 
    } 

    return 0; 
} 

但是,爲了回答你的問題:是的,std::this_thread::get_id()在VS2013非常可靠的。

相關問題