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));
我对 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));