在C++中关联packaged_task和线程

Associate packaged_task and thread in C++

本文关键字:task 线程 packaged C++ 关联      更新时间:2023-10-16

所有

我有一门课:

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的实例,就无法使用&someClass::someOperation。您意识到,因为您确实将一个这样的实例传递给了线程构造函数,但在packaged_task签名中忘记了它

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

另一个问题是,您正试图将task移动到三个不同的位置。这是行不通的:在它移动一次之后,task将不再有效,并且将它移动到其他线程中也不会达到您所期望的效果。你需要三个不同的任务。