многопоточность — ассоциирует packaged_task и поток в переполнении стека

все

У меня есть класс:

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

Решение

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]