gpt4 book ai didi

c++ - 在 C++11 中通过对 std::thread 的引用传递对象

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:53 25 4
gpt4 key购买 nike

为什么在创建 std::thread 时不能通过引用传递对象?

例如下面的代码片段给出了一个编译错误:

#include <iostream>
#include <thread>

using namespace std;

static void SimpleThread(int& a) // compile error
//static void SimpleThread(int a) // OK
{
cout << __PRETTY_FUNCTION__ << ":" << a << endl;
}

int main()
{
int a = 6;

auto thread1 = std::thread(SimpleThread, a);

thread1.join();
return 0;
}

错误:

In file included from /usr/include/c++/4.8/thread:39:0,
from ./std_thread_refs.cpp:5:
/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(int))(int&)>’:
/usr/include/c++/4.8/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {int&}]’
./std_thread_refs.cpp:19:47: required from here
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’
_M_invoke(_Index_tuple<_Indices...>)
^

我已更改为传递指针,但是否有更好的解决方法?

最佳答案

使用 reference_wrapper by using std::ref 显式初始化线程:

auto thread1 = std::thread(SimpleThread, std::ref(a));

(或 std::cref 而不是 std::ref,视情况而定)。根据 cppreference on std:thread 的注释:

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

关于c++ - 在 C++11 中通过对 std::thread 的引用传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com