正确使用函子C++ STL 线程
correct use of functor for C++ STL thread
我在理解函数对象作为 STL 中线程例程的正确用法C++遇到了一些困难。 根据我的理解,函子的好处之一是对象实例可以维护状态。 有时我希望一个或多个线程运行一些例程并计算一些结果。 然后,我在加入线程后从对象查询这些结果。 我正在尝试对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,但它返回零。 如何实例化具有状态的对象,让线程在该对象中运行例程,然后在线程完成后查询该对象的状态?
谢谢 缺口
当你传递值时,你会创建一个副本。因此,您可以通过引用包装器传递引用:
thread thread(std::ref(worker), 13);
或通过指针传递:
thread thread(&worker, 13);
在这两种情况下,您都必须确保对象生存期足够长。
不要复制,而是将线程绑定到引用:
thread thread(std::ref(worker), 13);
// ^^^^^^^^
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?