正确使用 C++ STL 线程的仿函数
correct use of functor for C++ STL thread
我在理解函数对象作为 C++ STL 中的线程例程的正确用法时遇到了一些困难。据我了解,函子的好处之一是对象实例可以保持状态。有时我希望一个或多个线程 运行 一些例程并计算一些结果。然后,在加入线程后,我从对象中查询这些结果。我正在尝试对 C++ STL 线程和 运行ning 做同样的事情来解决一些问题。问题似乎源于 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() 到 return 13 但它是 returning 零。如何使用状态实例化一个对象,在该对象中有一个线程 运行 一个例程,然后在线程完成后查询该对象的状态?
谢谢,
尼克
不要制作副本,而是将线程绑定到引用:
thread thread(std::ref(worker), 13);
// ^^^^^^^^
当您按值传递时,您会创建一个副本。因此,您可以通过引用包装器按引用传递:
thread thread(std::ref(worker), 13);
或者通过指针传递:
thread thread(&worker, 13);
在这两种情况下,您都必须确保对象生命周期足够长。
我在理解函数对象作为 C++ STL 中的线程例程的正确用法时遇到了一些困难。据我了解,函子的好处之一是对象实例可以保持状态。有时我希望一个或多个线程 运行 一些例程并计算一些结果。然后,在加入线程后,我从对象中查询这些结果。我正在尝试对 C++ STL 线程和 运行ning 做同样的事情来解决一些问题。问题似乎源于 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() 到 return 13 但它是 returning 零。如何使用状态实例化一个对象,在该对象中有一个线程 运行 一个例程,然后在线程完成后查询该对象的状态?
谢谢, 尼克
不要制作副本,而是将线程绑定到引用:
thread thread(std::ref(worker), 13);
// ^^^^^^^^
当您按值传递时,您会创建一个副本。因此,您可以通过引用包装器按引用传递:
thread thread(std::ref(worker), 13);
或者通过指针传递:
thread thread(&worker, 13);
在这两种情况下,您都必须确保对象生命周期足够长。