2013-08-06 2 views
0

всеAssociate 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 

Могу ли я знать, что я не прав, и как я могу сделать это правильно?

Большое спасибо заранее.

Long

+0

Не проблема здесь, но как вы думаете, 'std :: move (task)' делает? Так как он перемещается в первый поток, «задача» не будет действительна впоследствии для создания следующих потоков. –

+0

Могу ли я не понимать смысл 'packaged_task', но почему бы вам не использовать некоторые' std :: future 'напрямую? –

+0

@ArneMertz, откуда вы получаете фьючерсы? Вы можете * никогда * просто использовать фьючерсы напрямую. Вам нужен источник для них. 'packaged_task' является источником фьючерсов, которые дают результаты от выполнения функции. –

ответ

3

Проблема заключается в том, что &someClass::someOperation не может быть использована без экземпляра someClass. Вы понимаете, что, потому что вы пройти один такой экземпляр в конструктор потока, но забыл его в packaged_task подписи:

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

Другая проблема заключается в том, что вы пытаетесь переместить task в трех разных местах. Это не сработает: после того, как он переместится один раз, task больше не будет действителен, а перенос его в другие потоки не будет делать то, что вы ожидаете. Вам нужны три разные задачи.