无法将参数传递给 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 参数。模板扩展还在末尾包含 int 或 long 参数(bind.cpp 第 319 和 398 行)。
如何将这些参数传递给我的线程?
【问题讨论】:
boost::thread t1(bulk_messaging, ...)
。注意没有和号。
【参考方案1】:
通过指定thread(&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 构造函数的主要内容,如果未能解决你的问题,请参考以下文章