在C ++中关联packaged_task和thread

时间:2013-08-06 15:03:07

标签: c++ multithreading 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

我可以知道我错了什么,我该怎么办呢?

非常感谢提前。

1 个答案:

答案 0 :(得分:3)

问题是如果没有&someClass::someOperation的实例,someClass就无法使用。你意识到,因为你确实将一个这样的实例传递给线程构造函数,但在packaged_task签名中忘记了

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

另一个问题是,您正试图将task移至三个不同的位置。这不会起作用:在它移动一次之后,task将不再有效,并且将其移动到其他线程将不会达到您的预期。你需要三个不同的任务。