C++ STL 线程函子的正确使用

2023-11-21

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

谢谢, 缺口


当您按值传递时,您会制作一份副本。因此,您可以通过引用包装器来传递引用:

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

或通过指针传递:

thread thread(&worker, 13);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL 线程函子的正确使用 的相关文章

随机推荐

  • 如何动态渲染新的 Twitter 小部件?

    如果我在 Twitter 上注册一个小部件 我会得到以下代码 a class twitter timeline href https twitter com vinto60utd Tweets by vinto60utd a
  • Sequelize — 对 DATE 字段使用 UNIX 时间戳

    有没有办法强制 Sequelize 使用 UNIX 时间戳作为默认时间格式both对于createdAt updatedAt时间戳and对于自定义的 Sequelize DATE 字段类型 Thanks 附 我正在使用 MySQL Whil
  • Java:优先级队列

    我有一个java程序 它是这样的 公共类 PriorityQueue 示例 public static void main String args PriorityQueue
  • 哪种方法是最好的? AutoMapper 反对隐式(C# 参考)

    Automapper 是一种匹配类型的方法 理想情况下当您想要映射模型及其视图模型时 但这与我们在 C 中使用隐式实现的方法不一样吗 假设两个模型具有相同的属性但名称不同 在这种情况下 您需要在 AutoMapper 中指定模型之间链接的模
  • ios 上离子范围无法点击

    我在跨平台项目中使用离子 范围 输入 对于android和PC浏览器 如果我点击远离滑块节点的区域 滑块节点将跳转到我点击的位置 并且值将被更新 但对于 IOS 当我单击远离滑块节点的区域时 没有发生任何值变化 这也使得我的滑块很难点击 我
  • 条件恩弗斯审计

    我有一个要求 我只想审核状态字段更改的记录 我遵循了文档章节教程 15 8 条件审计 第 1 步 关闭自动 Envers 事件侦听器注册 我有以下内容
  • 如何使用 python 关闭网络浏览器

    我已经使用打开了一个网络浏览器窗口webbrowser open url 在 python 中 现在我想关闭使用 python 打开的网络浏览器 可以这样做吗 没有webbrowser close 您可以使用以下代码关闭任务 在Window
  • ShowDialog 使应用程序窗口从 Windows 的 Alt-Tab 列表中消失?

    我是 WPF 新手 我正在尝试从主窗口内打开模式对话框 public partial class MainWindow Window protected void OpenCommandExecuted object target Exec
  • 使用 jQuery 获取 div 的背景图像。是否有内置方法可以去掉 url() 部分?

    我正在使用此代码来获取背景图像div var bgImage content css backgroundImage 这是回归url 28http example com images layout content trans png 29
  • Java 中的非阻塞套接字写入与阻塞套接字写入

    为什么有人更喜欢阻塞写入而不是非阻塞写入 我的理解是 如果您想确保另一方在 write 方法返回后收到 TCP 数据包 则只需要阻止 write 但我什至不确定这是否可能 你必须冲洗并且冲洗必须冲洗底层操作系统写套接字缓冲区 那么非阻塞套接
  • 在 Android 后台使用相机

    我正在尝试将照片从相机中投入使用 Override public void onCreate super onCreate android os Debug waitForDebugger myCamera Camera open Surf
  • 如何获取多窗口 SceneDelegate Xcode 11 的当前 keywindow 等效项?

    我正在将适用于 iPadOS 的 iOS13 应用程序转换为 SceneDelegate 多窗口 如何从当前SceneDelegate获取当前UIWindow 我知道 a 可以使用访问当前场景UIView window or UIViewC
  • 为什么 os.system('cls') 不清除最近的输出?

    我一直在使用system cls 在使用 Dev C 之前使用 C 语言 现在正在学习Python 使用Pycharm 2020 2 3 我尝试使用os system cls 这是我的程序 import os print clear scr
  • 渲染 Ruby on Rails 后保留参数

    我有一个属于用户的项目 在我的用户视图中 我有一个添加新项目的链接 其中包含我想要将项目添加到的用户的参数 Url projects new id 62 向用户添加项目是可行的 问题是当添加新项目时验证失败并且我进行渲染时 def crea
  • 从 JSTL 读取属性文件

    我正在尝试使用 taglib 读取 JSTL 形式的 属性文件 但我无法访问它 我已在 web xml 中正确找到了 tld 文件 我确信这一点
  • 是否有相当于 Facebook Access Token linter/debugger 的 API?

    是否有一个与以下功能等效的图形 APIFacebook 访问令牌 linter 调试器我可以通过编程方式调用吗 短绒很好 它告诉您有关您拥有的令牌的各种很酷的信息 例如授予的权限 我可以通过me permissions 问题和到期日期 应用
  • 如何根据正在执行的目标激活配置文件

    当我从命令行执行某些目标时 我想 自动 激活配置文件 例如 我现在在做什么 mvn appengine devserver Pdevelopment mvn appengine update Pproduction 基本上我想在运行 dev
  • 访问 JSON 元素

    我从 URL 获取天气信息 weather urllib2 urlopen url wjson weather read 我得到的是 data current condition cloudcover 0 humidity 54 obser
  • 如何使用现有自定义主题隐藏 XML 中活动的标题栏

    我想隐藏某些活动的标题栏 问题是我对所有活动应用了一种样式 因此我不能简单地将主题设置为 android style Theme NoTitleBar 使用无标题栏主题作为我的样式的父项将从我的所有活动中删除标题栏 我可以在某处设置无标题样
  • C++ STL 线程函子的正确使用

    我在理解 C STL 中函数对象作为线程例程的正确用法时遇到一些困难 根据我的理解 函子的好处之一是对象实例可以维护状态 有时我希望一个或多个线程运行一些例程并计算一些结果 然后 在加入线程后 我从对象中查询这些结果 我正在尝试对 C ST