将参数传递给 std::thread 包装器

2024-04-06

我想实现一个小型线程包装器,它提供线程是否仍处于活动状态或者线程是否已完成其工作的信息。为此,我需要将线程类要执行的函数及其参数传递给另一个函数。我有一个简单的实现,应该可以工作,但无法编译它,而且我不知道该怎么做才能使它工作。

这是我的代码:

#include <unistd.h>
#include <iomanip>
#include <iostream>
#include <thread>
#include <utility>

class ManagedThread
{
public:
   template< class Function, class... Args> explicit ManagedThread( Function&& f, Args&&... args);
   bool isActive() const { return mActive; }
private:
   volatile bool  mActive;
   std::thread    mThread;
};

template< class Function, class... Args>
   void threadFunction( volatile bool& active_flag, Function&& f, Args&&... args)
{
   active_flag = true;
   f( args...);
   active_flag = false;
}

template< class Function, class... Args>
   ManagedThread::ManagedThread( Function&& f, Args&&... args):
      mActive( false),
      mThread( threadFunction< Function, Args...>, std::ref( mActive), f, args...)
{
}

static void func() { std::cout << "thread 1" << std::endl; }

int main() {
   ManagedThread  mt1( func);
   std::cout << "thread 1 active = " << std::boolalpha << mt1.isActive() << std::endl;
   ::sleep( 1);
   std::cout << "thread 1 active = " << std::boolalpha << mt1.isActive() << std::endl;

   return 0;
}

我得到的编译器错误:

In file included from /usr/include/c++/5/thread:39:0,
                 from prog.cpp:4:
/usr/include/c++/5/functional: In instantiation of 'struct std::_Bind_simple<void (*(std::reference_wrapper<volatile bool>, void (*)()))(volatile bool&, void (&)())>':
/usr/include/c++/5/thread:137:59:   required from 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(volatile bool&, void (&)()); _Args = {std::reference_wrapper<volatile bool>, void (&)()}]'
prog.cpp:28:82:   required from 'ManagedThread::ManagedThread(Function&&, Args&& ...) [with Function = void (&)(); Args = {}]'
prog.cpp:35:28:   required from here
/usr/include/c++/5/functional:1505:61: error: no type named 'type' in 'class std::result_of<void (*(std::reference_wrapper<volatile bool>, void (*)()))(volatile bool&, void (&)())>'
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/5/functional:1526:9: error: no type named 'type' in 'class std::result_of<void (*(std::reference_wrapper<volatile bool>, void (*)()))(volatile bool&, void (&)())>'
         _M_invoke(_Index_tuple<_Indices...>)
         ^

此处提供了实时示例:https://ideone.com/jhBF1q https://ideone.com/jhBF1q


在错误消息中,您可以看到差异void (*)() vs void (&)()。那是因为std::thread 的构造函数 http://en.cppreference.com/w/cpp/thread/thread/thread参数是std::decayed.

还添加std::ref to f:

template< class Function, class... Args>
   ManagedThread::ManagedThread( Function&& f, Args&&... args):
      mActive( false),
      mThread( threadFunction< Function, Args...>, std::ref(mActive), std::ref(f), std::forward<Args>(args)...)
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将参数传递给 std::thread 包装器 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N

随机推荐

  • 文件 jobtracker.info 只能复制到 0 个节点,而不是 1 个

    我正在尝试设置Hadoop簇于Fedora 17 当我给予 bin star all sh命令守护进程正在主节点和从节点上启动 但是当我查看主节点上数据节点的日志文件时 我得到以下 EROOR 错误org apache hadoop sec
  • Java AES/CBC/PKCS5Padding 的 C# 加密/解密

    我在尝试解密已在 Java 中使用以下属性 Java 代码 加密的字符串时遇到问题 public static Builder getDefaultBuilder String key String salt byte iv return
  • 一个模板专用于多个枚举值

    通常 如果我想通过枚举拥有一个模板化 数据 类 我会写这样的东西 enum class Modes int m1 1 m2 2 m3 3 template
  • 如何将 statsmodels.tsa.seasonal.seasonal_decompose 与 pandas 数据框一起使用

    from statsmodels tsa seasonal import seasonal decompose def seasonal decomp df model additive seasonal df None seasonal
  • 扩展 Autodesk Forge:将我自己的扩展添加到包后,我的控制面板无法连接到 Revit 模型

    我用过这个包 https github com petrbroz forge iot extensions demo https github com petrbroz forge iot extensions demo 之后 我添加了自己
  • 查找数组长度的时间复杂度

    我对时间复杂度有点困惑len 函数将是 我读过很多不同的文章 在 python 中查找数组的长度是O 1 与len 函数和其他语言类似 这怎么可能 您是否不必遍历整个数组来计算它占用了多少个索引 您是否不必遍历整个数组来计算它占用了多少个索
  • 当第一个查询使用只读数据库时,Android 无法升级我的数据库

    所以到目前为止我一直严重依赖自动化 几乎 onCreate onUpgrade我的方法SQLite数据库 一切都工作正常 我只需更改数据库的版本号即可运行onUpgrade自动地 但现在 当我尝试向数据库添加列并更改版本号时 我遇到了该异常
  • 适用于 Raspberry Pi 的触摸屏 Kivy 应用

    场景如下 我使用 python 框架编写了一个 guiKivy http kivy org 我想在树莓派上运行它这个触摸屏 https learn adafruit com adafruit pitft 28 inch resistive
  • 获取默认远程推送和默认远程分支

    我想从脚本中获取默认的推送远程和默认的推送分支 对于召回 git 将按以下顺序在这些设置之间选择远程 branch
  • Ruby - Proc.call - 捕获异常

    我在捕获调用中的异常和错误时遇到问题Proc object 看我的代码 def method1 do something end def method2 do something end def run method safely proc
  • Ember:在 Mixin 中以编程方式设置 queryParams

    我正在尝试以编程方式在 Ember Mixin 中定义 queryParams mixin 有一个方法 当持有 mixin 的控制器初始化时会调用该方法 setupQueryParams params gt params forEach p
  • 运行JDK代码时Java JIT会作弊吗?

    我正在对一些代码进行基准测试 但我无法让它运行得像java math BigInteger https docs oracle com javase 7 docs api java math BigInteger html 即使使用完全相同
  • MySQL,我应该保持连接还是在需要时连接?

    我一直在将家里的温度记录到 MySQL 数据库 每 5 分钟总共读取 10 个传感器 并且一直在使用 Python 但我想知道一些事情 目前 当我第一次运行程序时 我运行到 MySQL 的正常连接 该连接仅运行一次 db MySQLdb c
  • 如何通过按住Java中的JPanel来移动未修饰的JFrame? [复制]

    这个问题在这里已经有答案了 到目前为止 我一直在制作一个未装饰的 JFrame 我想知道是否可以通过按住 JPanel 上的单击来移动未装饰的 JFrame 这是我正在处理的源代码 private static void createFra
  • jquery自动完成颜色变化

    I am using bootstrap for UI and jquery custome UI for autocomplete When suggested items are listed i would like to match
  • SFML 绘制像素阵列

    我找到了这个 http lodev org cgtutor raycasting html http lodev org cgtutor raycasting html 互联网上的教程 我很感兴趣并想自己制作 不过我想在 SFML 中做到这
  • 什么才是真正性能更高的? Haskell 或 OCaml [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用复选框回发带有标志的枚举

    我有一个枚举属性 我试图通过复选框设置它的值 枚举被标记 当用户选择多个选项时 我希望该属性将所有选定的标记连接起来 我尝试为每个枚举值添加一个复选框 并为每个复选框指定相同的名称 在回发期间 将检索第一个选定的标志 但不会与其他标志连接
  • 防止 DataGrid 滚动对齐行

    我有一个 DataGrid 其中每一行都包含一个 ItemsControl 因此 网格的行可能会非常高 如果一行比网格的高度高 我无法滚动查看该行的其余部分 因为 DataGrid 会自动滚动到下一行 也就是说 如果我正在查看第 1 行的上
  • 将参数传递给 std::thread 包装器

    我想实现一个小型线程包装器 它提供线程是否仍处于活动状态或者线程是否已完成其工作的信息 为此 我需要将线程类要执行的函数及其参数传递给另一个函数 我有一个简单的实现 应该可以工作 但无法编译它 而且我不知道该怎么做才能使它工作 这是我的代码