все
У меня есть класс:
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
Могу ли я узнать, что я не прав, и как я могу сделать это правильно?
Спасибо заранее.
Долго
Проблема в том, что &someClass::someOperation
не может быть использован без экземпляра someClass
, Вы понимаете, что, поскольку вы передаете один такой экземпляр в конструктор потока, но забыл это в packaged_task
подпись:
std::packaged_task<vector<int>(someClass*, int, int)> task(&someClass::someOperation);
Другая проблема заключается в том, что вы пытаетесь двигаться task
в трех разных местах. Это не сработает: после одного движения task
больше не будет действительным, и перемещение его в другие потоки не будет делать то, что вы ожидаете. Вам нужно три разные задачи.
Других решений пока нет …