2013-08-06 33 views
0

所有副packaged_task和線程在C++

我有一個類:

class someClass 
{ 
public: 
    vector<int> someOperation(int start, int end) 
    { 
     // do something... 
    } 
} 

和主要功能:

int main() 
{ 
    someClass obj; 

    std::packaged_task<vector<int>(int, int)> task(&someClass::someOperation); 

    std::thread t1 = std::thread(std::move(task), &obj, 0, 200); // Error happens here 
    std::thread t2 = std::thread(std::move(task), &obj, 201, 400); 
    std::thread t3 = std::thread(std::move(task), &obj, 401, 600); 

    t1.join(); 
    t2.join(); 
    t3.join(); 

    return 0; 
} 

我希望這段代碼可以創建一個運行相同的三個線程在一塊數據的不同部分進行操作。然而,在線程t1的定義,下面的錯誤編譯器持久性有機污染物:

error C2046: term does not evaluate to a function taking 3 arguments 

可我知道我是什麼錯了,我怎麼能做到這一點嗎?

非常感謝提前。

+0

這裏沒有真正的問題,但是你認爲'std :: move(task)'有什麼作用?由於它被移動到第一個線程中,因此'任務'在創建下一個線程之後將不再有效。 –

+0

可能是我沒有理解'packaged_task'的含義,但爲什麼不直接使用'std :: future's? –

+0

@ArneMertz你從哪裏得到期貨?你可以*永遠不會直接使用期貨。你需要一些資源。 'packaged_task'是產生執行函數結果的期貨來源。 –

回答

3

的問題是,&someClass::someOperation離不開的someClass實例中使用。你認識到通過,因爲你做一個這樣的例子在螺紋構造,但在packaged_task簽名忘了

std::packaged_task<vector<int>(someClass*, int, int)> task(&someClass::someOperation); 

另一個問題是,你試圖移動task分爲三個不同的地方。這是行不通的:在它移動一次之後,task將不再有效,並將其移入其他線程將不會達到您的預期。你需要三個不同的任務。