2017-03-20 66 views
2

我在理解C++ STL中作爲線程例程的函數對象的正確用法時遇到了一些困難。根據我的理解,函子的一個好處是對象實例可以保持狀態。有時候我想要一個或多個線程運行一些例程並計算一些結果。然後我在加入線程後查詢這些對象的結果。我試圖用C++ STL線程做同樣的事情,並遇到一些問題。看來問題源於C++ STL線程複製了我的對象,因此我不確定在加入線程時如何檢查結果。這裏的代碼片段:正確使用functor for C++ STL線程

#include <iostream> 
#include <thread> 

using namespace std; 

class Worker 
{ 
public: 
    Worker() : _value(0) 
    { 
    } 

    void operator()(unsigned int value); 

    unsigned int get_value() {return this->_value;} 

private: 
    unsigned int _value; 
}; 

void Worker::operator()(unsigned int value) 
{ 
    this->_value = value; 
} 

int main() 
{ 
    Worker worker; 
    thread thread(worker, 13); 
    thread.join(); 
    unsigned int value = worker.get_value(); 
    cout << "value: " << value << endl; 
} 

上面的例子是我遇到的問題只是一個簡單的攝製。我期望worker.get_value()返回13,但它返回零。我該如何去實例化一個具有狀態的對象,讓線程在該對象中運行例程,然後在線程完成後查詢該對象的狀態?

感謝, 尼克

回答

3

當你按值傳遞你犯了一個副本。所以,你可以參考參考通過包裝傳遞:

thread thread(std::ref(worker), 13); 

或指針傳遞:

thread thread(&worker, 13); 
中,你必須確保對象的生命週期足夠長,這兩種情況下

1

不要複製,而是將線程綁定到一個參考:

thread thread(std::ref(worker), 13); 
//   ^^^^^^^^ 
+0

[Demo](http://melpon.org/wandbox/permlink/hLi31ibs7nc3VqnK) –