【问题标题】:correct use of functor for C++ STL thread为 C++ STL 线程正确使用仿函数
【发布时间】:2017-08-11 04:50:16
【问题描述】:

我在理解函数对象作为 C++ STL 中的线程例程的正确用法时遇到了一些困难。据我了解,仿函数的好处之一是对象实例可以保持状态。有时我希望一个或多个线程运行一些例程并计算一些结果。然后,我在加入线程后从对象中查询这些结果。我正在尝试对 C++ STL 线程做同样的事情并遇到一些问题。问题似乎源于 C++ STL 线程复制了我的对象这一事实,因此我不确定当我加入线程时应该如何检查结果。这是代码的sn-p:

#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 但它返回零。如何实例化具有状态的对象,让线程在该对象中运行例程,然后在线程完成后查询该对象的状态?

谢谢, 尼克

【问题讨论】:

    标签: c++ multithreading stl functor


    【解决方案1】:

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

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

    或通过指针传递:

    thread thread(&worker, 13);
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多