正确使用C ++ STL线程的仿函数

时间:2017-03-20 01:46:08

标签: 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;
}

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

谢谢, 尼克

2 个答案:

答案 0 :(得分:4)

当你通过价值时,你会复制一份。所以你可以通过引用包装器传递引用:

thread thread(std::ref(worker), 13);

或通过指针传递:

thread thread(&worker, 13);

在这两种情况下,你必须确保对象的生命周期足够长。

答案 1 :(得分:2)

不要复制,而是将线程绑定到引用:

thread thread(std::ref(worker), 13);
//            ^^^^^^^^