hufei208 2019-04-04 18:54 采纳率: 0%
浏览 871

boost::thread 库在调用join或者detach接口时,会释放系统哪些资源?

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include<boost/function.hpp>
class HelloWorld;
extern void hello_2(boost::shared_ptr<HelloWorld> he);
extern void hello_3();

typedef boost::function<void()> Func_t;


class HelloWorld: public boost::enable_shared_from_this<HelloWorld>
{
public:
 HelloWorld(std::string name):name_(name),b_(name)
 {

         std::cout<<"HelloWorld begin:"<<name_<<std::endl;
         std::cout<<"HelloWorld end:"<<name_<<std::endl;
 }
~HelloWorld()
{
        std::cout<<"~HelloWorld begin:"<<name_<<std::endl;
        //thread_group_.join_all();
        sleep(5);
        std::cout<<"~HelloWorld end:"<<name_<<std::endl;
}
void hello_1()
{
        std::cout <<"Hello_1 world, I''m a thread!"<< std::endl;
        sleep(5);
        std::cout<<"sleep 5s"<<std::endl;
}
 void start()
 {
        //boost::shared_ptr<HelloWorld> data_transmitter_ptr = shared_from_this();
        //boost::shared_ptr<HelloWorld> hello2(new HelloWorld("submain"));  
             //thread_group_.create_thread( boost::bind(&HelloWorld::hello_1, data_transmitter_ptr) );//进不了HelloWorld析构
            //thread_group_.join_all();//可进入HelloWorld析构
        //thread_group_.create_thread( boost::bind(&hello_2,hello2) );//可进入HelloWorld析构
        //thread_group_.create_thread( boost::bind(&hello_2,data_transmitter_ptr) );//不可进入析构HelloWorld析构
        //thread_group_.create_thread( boost::bind(&hello_3) );//可以进入HelloWorld析构

 }
 boost::thread_group thread_group_;
 std::string name_;
};
void hello_2(boost::shared_ptr<HelloWorld> he)
{
        //boost::shared_ptr<HelloWorld> hello2(new HelloWorld());
        std::cout <<"Hello_2 world, I''m a thread begin!"<< std::endl;
        std::cout <<"Hello_2 world, I''m a thread end!"<< std::endl;
}
void hello_3()
{
        //boost::shared_ptr<HelloWorld> hello2(new HelloWorld());
        std::cout <<"Hello_2 world, I''m a thread!"<< std::endl;
}
int main(int argc, char* argv[])
{
        {
                boost::shared_ptr<HelloWorld> hello(new HelloWorld("main"));
                hello->start();
                sleep(3);
                std::cout<<"sleep 3"<<std::endl;
        }
 while(true)
 {
         sleep(1);
         std::cout<<"sleep 1s"<<std::endl;
 }
 return 0;
}

//各位大神,问题如下,急急急:
1.boost::thread或者boost::thread_group,在创建线程时会绑定一个函数对象(暂时记录为FuncA),那什么时候这个函数对象生命周期结束?是join或者detach函数调用之后吗?有没有从源码层大概分析,解释下释放这个FuncA函数对象资源相关参考信息?
2.是否join或者detach不能在本身类似于HelloWorl析构函数中调用,这是个禁忌吗?

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 21:31
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘