无法将参数传递给 boost::thread 构造函数

Posted

技术标签:

【中文标题】无法将参数传递给 boost::thread 构造函数【英文标题】:Cannot pass parameters to boost::thread constructor 【发布时间】:2019-12-05 21:28:45 【问题描述】:

我在 TEST_SUITE TEST_CASE 中定义了两个函数。我正在 Visual Studio 2019 v16.3.9 上进行开发,并且还在 Ubuntu 上运行了测试。

auto bulk_messaging = [&](std::shared_ptr<pml_webserver::ws_handler> whoosh, std::string& bulk_text, std::string& keystr)

    // code omitted

auto tracked_messaging = [&](std::shared_ptr<pml_webserver::ws_handler> &whoosh, std::list<std::string>& keystrings)

    // code omitted

我可以在 SUBCASE 中成功调用这些。

bulk_messaging(wsPrior, very_long_string, text_key);
tracked_messaging(wsCentral, central_keys);
bulk_messaging(wsFollower, lots_of_numbers, number_key);

我想在线程中同时运行它们,但无法编译任何东西。代码

boost::thread t1(&bulk_messaging, wsPrior, boost::ref(very_long_string), boost::ref(text_key));
t1.join();

导致以

结尾的错误
psoc_lib_plugin_test.cpp(1048): note: see reference to function template instantiation 'boost::thread::thread<_DOCTEST_ANON_SUITE_13::_DOCTEST_ANON_FUNC_14::<lambda_952ddee667f9559e5a67f99a19459356>*,std::shared_ptr<pml_webserver::ws_handler>,boost::reference_wrapper<std::string>,boost::reference_wrapper<std::string>>(F,A1,A2,A3)' being compiled
  with
  [
      F=_DOCTEST_ANON_SUITE_13::_DOCTEST_ANON_FUNC_14::<lambda_952ddee667f9559e5a67f99a19459356> *,
      A1=std::shared_ptr<pml_webserver::ws_handler>,
      A2=boost::reference_wrapper<std::string>,
      A3=boost::reference_wrapper<std::string>
  ]

还有代码

boost::thread t2(&tracked_messaging, boost::ref(wsCentral), boost::ref(central_keys));
t2.join();

导致以

结尾的错误
psoc_lib_plugin_test.cpp(1051): note: see reference to function template instantiation 'boost::thread::thread<_DOCTEST_ANON_SUITE_13::_DOCTEST_ANON_FUNC_14::<lambda_8f6672069634168b5ecabedf95db1e26>*,boost::reference_wrapper<std::shared_ptr<pml_webserver::ws_handler>>,boost::reference_wrapper<std::list<std::string,std::allocator<_Ty>>>>(F,A1,A2)' being compiled
      with
      [
          _Ty=std::string,
          F=_DOCTEST_ANON_SUITE_13::_DOCTEST_ANON_FUNC_14::<lambda_8f6672069634168b5ecabedf95db1e26> *,
          A1=boost::reference_wrapper<std::shared_ptr<pml_webserver::ws_handler>>,
          A2=boost::reference_wrapper<std::list<std::string,std::allocator<std::string>>>
      ]

我不理解文档,因为示例仅传递 int 参数。模板扩展还在末尾包含 intlong 参数(bind.cpp 第 319 和 398 行)。

如何将这些参数传递给我的线程?

【问题讨论】:

boost::thread t1(bulk_messaging, ...) 。注意没有和号。 【参考方案1】:

通过指定thread(&amp;bulk_messaging,...),您将一个指向 lambda 的指针作为第一个参数传递。

指向对象的指针不是可调用的,即使对象本身是。

您需要直接传递 lambda (thread(bulk_messaging,...)),这会将 lambda 对象复制到线程中,或者传递对它的引用 (thread(std::ref(bulk_messaging),...) 以避免复制。在后一种情况下,您需要确保您的 lambda 比线程寿命更长。

【讨论】:

谢谢。我遇到了链接错误,但通过在我的 CMakeLists.txt 文件中添加 find_package(Boost COMPONENTS thread REQUIRED)target_link_libraries(Boost::thread) 解决了这些错误。

以上是关于无法将参数传递给 boost::thread 构造函数的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 boost::thread 没有重载函数需要 2 个参数

在 boost::thread 中将参数传递给函数

试图将类作为参数传递给不同的类构造函数,但出现“转换”错误

PyQt4 将转换矩阵作为参数传递给构造函数

Pybind11:将字符串*参数传递给构造函数

如何将参数传递给静态类构造函数?