接下来,聊一聊主题–Thread
/***Thread.h***/class Thread : boost::noncopyable //禁止拷贝{ public: typedef boost::function<void ()> ThreadFunc;//仿函数对象,利用回调的方式使用线程函数 explicit Thread(const ThreadFunc&, const string& name = string());//普通的线程构造函数#ifdef __GXX_EXPERIMENTAL_CXX0X__ explicit Thread(ThreadFunc&&, const string& name = string());//移动的线程构造函数,比上面的更节省资源std::move#endif ~Thread();//析构函数 void start();//启动线程 int join(); // 类似于 pthread_join() bool started() const { return started_; } // pthread_t pthreadId() const { return pthreadId_; } pid_t tid() const { return *tid_; } //返回线程索引 const string& name() const { return name_; }//返回线程名字 static int numCreated() { return numCreated_.get(); } PRivate: void setDefaultName(); bool started_; //是否启动 bool joined_; //是否终止 pthread_t pthreadId_; //线程索引 boost::shared_ptr<pid_t> tid_; //指向线程索引的智能指针 ThreadFunc func_; //线程主题函数 string name_; //线程名字 static AtomicInt32 numCreated_; //static变量在所有的线程对象中共享,为由该类产生的线程排序};在muduo的线程对象封装中,最精彩的是使用boost::function函数对象将线程函数以回调的方式传递进线程对象中。typedef boost::function<void ()> ThreadFun;
将线程中的若干数据保存到ThreadData中,然后将ThreadData作为传递给pthread_create(...,void* arg)
中的最后一个数据参数传递给void Thread(void* )
标准的线程启动函数。然后在标准的线程启动函数内将void* arg
强行转化为ThreadData,然后使用ThreadData中的runInThread函数启动线程。
在使用muduo的线程接口时,使用bind将线程运行函数再打包,然后传递进Thread.
新闻热点
疑难解答