如何创建一个主函数需要引用参数的线程?

Posted

技术标签:

【中文标题】如何创建一个主函数需要引用参数的线程?【英文标题】:How to create a thread whose main function requires a reference argument? 【发布时间】:2019-09-12 07:18:54 【问题描述】:

我需要在线程中创建对变量的引用。当我在下面的代码中执行此操作时,出现两个错误:

C2672: 'std::invoke': 找不到匹配的重载函数

C2893:无法专门化函数模板“unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)

如何正确编码?

#include <thread>

void foo(double a, double& b)

  b = a;


int main()

  double a = 0.0, b = 0.0;

  std::thread f(foo, a, b);

  f.join();

【问题讨论】:

C++ Thread function pass by reference的可能重复 【参考方案1】:

这就是std::reference_wrapper 及其两个创建者函数std::refstd::cref 的用途:

std::thread f(foo, a, std::ref(b));

[Live example]

std::reference_wrapper&lt;T&gt; 是一个有效行为类似于可重新绑定引用的对象:它定义了 operator T&amp; 用于隐式转换为 T&amp;,但可以重新分配。它专门用于需要“可复制引用”的情况,例如std::bindstd::thread

使用std::ref 创建对x 的非常量引用,使用std::cref 创建对x 的常量引用。

【讨论】:

std::ref 适用于任何类型的指针。抱歉我之前的评论,我在我的代码中发现了一个错误。

以上是关于如何创建一个主函数需要引用参数的线程?的主要内容,如果未能解决你的问题,请参考以下文章

jmeter参数化(三种方法)

在c语言中子函数引用主函数中的值和引用主函数某个值的地址的区别

JAVA-初步认识-第六章-引用数据类型参数传递图解

指针能作为引用参数吗?

Jmeter 线程之间传递参数

如何正确访问通过从标准输入引用构造函数传递的参数的值?