#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析构函数中调用,这是个禁忌吗?