2014-02-21 84 views
0

當在C++ 11中查找線程示例時,每個示例都會加入線程。我是否總是需要加入線程?

我需要加入線程嗎?

更多信息
我在「遊戲圈」所以這是不可能的,之前線程完成執行程序將退出創建線程。線程函數完成執行後,我可以只設置一個原子標誌,如done

例如
請把這個例子在這裏是否已加載美孚只得出:

struct Foo { 
    std::atomic<bool> isLoaded = false; 
    void load() { 
     std::thread([&isLoaded]() { 
      doSomethingExpensive(); 
      isLoaded = true; 
     }); 
    } 
    void draw() { 
     if (!isLoaded) { return; } 
    } 
} 

void App::setup() { 
    for (int i = 0; i<100; ++i) { 
     std::shared_ptr<Foo> fooPtr; 
     fooPtr->load(); 
     fooPtrs.push_back(fooPtr); 
    } 
} 

void App::loop() { 
    for (auto &foo : fooPtrs) { 
     fooPtrs->draw(); 
    } 
} 

這是合適的/好習慣/一個好的策略?

+0

對於任何感興趣的人,Scott Meyers在他的[Going Native 2013談話](http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler)中對此有點談。我可以看到至少有一個正確的答案:你永遠不應該允許可連接的線程被銷燬。 – user786653

回答

2

這將導致您的程序退出。當一個線程超出範圍時,如果它沒有被連接或分離,它將導致程序終止。你可以分離線程,但是你無法訪問它。更好的解決方案是使線程成爲類的成員,以便在創建它之後不會超出範圍。只要你確保清理得當,在這種情況下,不需要連接。