C++的thread库,遇到函数参数是引用的情况


线程初始化,调用函数的时候,函数的参数都是按值传递的,这样做的目的是:

防止在线程不过参数时,得到悬挂的引用。这样线程会发生不可预料的错误。

std:ref和std:cref就是对引用的wrapper。

std::ref函数的原型如下:

template< class T >
std::reference_wrapper ref( T& t ) noexcept; // C++11
template< class T >
constexpr std::reference_wrapper ref( T& t ) noexcept; // C++20

例如下面的函数,当用这个函数对线程初始化时,需要对引用的参数进行wrapper

// 函数原型
void Load(const std::string& name, bool is_append, std::vectorstring>& name_list);

// 线程初始化,正确的做法 std::thread t1(Load, std::cref(name), true, std::ref(main_name_list));

// 错误做法,无法通过编译 std::thread t1(Load, name, true, main_name_list);
cpp