【问题标题】:Multi-threading with classes in C++多线程与 C++ 中的类
【发布时间】:2019-10-15 08:25:33
【问题描述】:

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

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。我之前在线程中使用它,一切正常。

在 C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/thread:39:0 包含的文件中, 来自 main.cpp:13: C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional: 在 '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: 需要来自 'std::thread::thread(_Callable&&, _Args&& ... ) [with _Callable = void (chal::Variable::*)(chal::Grid&); _Args = {chal::Variable&, chal::Grid&}]' main.cpp:45:61:从这里需要 C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional:1505:61: 错误:'class std::result_of(chal ::变量,chal::Grid)>' typedef typename result_of<_callable>::type result_type; ^ C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/functional:1526:9: 错误:'class std::result_of(chal ::变量,chal::Grid)>' _M_invoke(_Index_tuple<_indices...>)

【问题讨论】:

  • 这个 sn-p 不能编译的原因有很多。请提供minimal reproducible example
  • @bloody 我只想知道,我应该如何传递一个对象,该对象是 Variable::initialize() 方法的参数,这就是我要问的全部
  • @acraig5075 抱歉,打错了
  • 你传递了一个指向Variable::initialize(Grid&amp;)的指针,你需要传递一个引用:std::thread first (&amp;Variable::initialize, ptr_T, std::ref(an_chan));
  • @MikevanDyke 你的评论应该是一个答案。

标签: c++ multithreading class objective-c++


【解决方案1】:

当您的 initialize 函数通过引用获取它的参数时,您应该将参数包装在 std::ref 中。

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

【讨论】:

    【解决方案2】:

    正如@acraig5075 提到的:

    std::thread 构造函数的第二个参数应该是指向对象的指针。您正在取消引用 ptr_T。

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

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

    【讨论】:

    • 这修复了语法错误,但它通过值传递网格,因此initialize 所做的更改不会显示在原始对象中。
    • 请注意,引用的文本不正确。当线程构造函数的第一个参数是指向成员函数的指针时,第二个参数可以是对象、对对象的引用或指向对象的指针。 *ptr_T 不会是语法错误,但很可能是逻辑错误。
    猜你喜欢
    • 2018-08-24
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多