C++ Boost,在类中使用 thread_group

Posted

技术标签:

【中文标题】C++ Boost,在类中使用 thread_group【英文标题】:C++ Boost, using thread_group in a class 【发布时间】:2011-12-16 05:04:30 【问题描述】:
class c

public:
    int id;
    boost::thread_group thd;
    c(int id) : id(id) 
    void operator()()
    
        thd.create_thread(c(1));
        cout << id << endl;
    


;

我创建了 c 类。每个类对象都创建线程以处理工作。但是,当我编译这个时,我收到了这个奇怪的消息

:错误 C2248:“boost::thread_group::thread_group”:无法访问在类“boost::thread_group”中声明的私有成员

此外,只是假设没有递归调用问题。

【问题讨论】:

【参考方案1】:

问题在于您的代码设置方式是传递对象的副本以创建新线程。

您收到错误是因为 boost::thread_group 的复制构造函数是私有的,因此您无法复制 c 类的对象。您不能复制 c 类的对象,因为默认的复制构造函数会尝试复制所有成员,并且无法复制 boost::thread_group。因此编译器错误。

对此的经典解决方案是编写您自己的复制构造函数,该构造函数不会尝试复制 boost::thread_group(如果您实际上希望每次调用一个唯一的 thread_group)或将 boost::thread_group 存储在一些指针中可以复制的类型(可以共享组,并且可能是您想要的)。

注意:

不编写自己的 operator() 通常更简单,而是传递 boost::functions。这将通过

来完成
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
class c

public:
    boost::thread_group thd;

    void myFunc(int id)
    
        boost::function<void(void)> fun = boost::bind(&c::myFunc,this,1);
        thd.create_thread(fun);
        cout << id << endl;
    


;

请注意,类 c 中的任何内容都是共享的,而函数调用中通过值传递的任何内容都不是共享的。

【讨论】:

但我必须创建具有成员变量和函数的类对象。所以我不能把线程作为一个函数。有没有像我上面那样创建类对象? @LeeJae 正如我在回答中提到的,您必须将 boost::thread_group 存储在某种指针中。我建议使用 shared_ptr。 非常感谢。我对 boost 库了解不多。无论如何,谢谢 @Lee 只是不要忘记在开始使用它之前实际创建线程组。例如, void initPool() thd = boost::make_shared&lt;boost::thread_group&gt;(); (注意你需要#include )

以上是关于C++ Boost,在类中使用 thread_group的主要内容,如果未能解决你的问题,请参考以下文章

C++:在类中使用静态成员函数

如何将类中的函数放入线程中? (使用 Boost 的 C++)

ROS2学习笔记17--在类中使用参数(C++)

需要帮助使用 boost 在类定义中为向量分配空间

C++在类中定义vector并初始大小的问题

在类中访问结构对象变量 - C++