C++ 中 类 的多线程

Multi-threading with classes in C++

我对 C++ 中的线程有疑问。我想创建由 class 成员方法组成的线程,并分配了特定对象。更重要的是,另一个用户定义的对象 class 被传递给该方法。请在下面找到代码:

Grid an_chan(NX, NY, xmax, ymax);
an_chan.calc_paraFlow(anode);

Grid *ptr_grid = &an_chan;    

Variable T(Tin, Tinit, lambda_m, rho_m, Cp_m);
Variable *ptr_T = &T;

std::thread first (&Variable::initialize, ptr_T, ptr_grid);

first.join();

初始化方法原型如下:

void Variable::initialize(Grid& grid_obj)

在我尝试添加线程之前,一切正常。

我只是想知道这是否是编译器问题?也许我的代码有问题我没注意到?任何可能的修复? 下面我包含了编译器返回的错误。如您所见,我使用的是 TDM GCC 5.1.0。我之前在线程中使用它,一切正常。

In file included from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/thread:39:0, from main.cpp:13: C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional: In instantiation of 'struct std::_Bind_simple(chal::Variable, chal::Grid)>': C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/thread:142:59: required from 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (chal::Variable::*)(chal::Grid&); _Args = {chal::Variable&, chal::Grid&}]' main.cpp:45:61: required from here C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional:1505:61: error: no type named 'type' in 'class std::result_of(chal::Variable, chal::Grid)>' typedef typename result_of<_Callable(_Args...)>::type result_type; ^ C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional:1526:9: error: no type named 'type' in 'class std::result_of(chal::Variable, chal::Grid)>' _M_invoke(_Index_tuple<_Indices...>)

由于您的 initialize 函数通过引用获取它的参数,您应该将参数包装在 std::ref.

std::thread first(&Variable::initialize, ptr_T, std::ref(*ptr_grid));

如@acraig5075 所述:

The second parameter to the std::thread constructor should be a pointer to the object. You're dereferencing ptr_T.

在此之后,您可能还想在传递给线程之前绑定函数:

std::thread first(std::bind(&Variable::initialize, ptr_T, *ptr_grid));