为C ++ STL线程正确使用functor

nic*_*kdu 4 c++ multithreading stl functor

我在理解功能对象作为C ++ STL中的线程例程的正确用法时遇到一些困难。根据我的理解,函子的好处之一是对象实例可以维护状态。有时候,我希望一个或多个线程运行一些例程并计算一些结果。然后,我在加入线程后从对象查询那些结果。我正在尝试对C ++ STL线程执行相同操作,并遇到一些问题。看来问题出在C ++ STL线程复制了我的对象,因此我不确定加入线程时应该如何检查结果。这是一段代码:

#include <iostream>
#include <thread>

using namespace std;

class Worker
{
public:
    Worker() : _value(0)
    {
    }

    void operator()(unsigned int value);

    unsigned int get_value() {return this->_value;}

private:
    unsigned int _value;
};

void Worker::operator()(unsigned int value)
{
    this->_value = value;
}

int main()
{
    Worker worker;
    thread thread(worker, 13);
    thread.join();
    unsigned int value = worker.get_value();
    cout << "value: " << value << endl;
}
Run Code Online (Sandbox Code Playgroud)

上面的示例只是我遇到的问题的简单再现。我希望worker.get_value()返回13但它返回零。我该如何实例化具有状态的对象,让线程在该对象中运行例程,然后在线程完成后查询该对象的状态?

谢谢,尼克

Sla*_*ica 5

当您按值传递时,您将复制一份。因此,您可以通过引用包装器按引用传递:

thread thread(std::ref(worker), 13);
Run Code Online (Sandbox Code Playgroud)

或通过指针传递:

thread thread(&worker, 13);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都必须确保对象生存期足够长。