一. 线程启动
线程的启动由传递一个没有构造函数的Callable类,之后复制到内存,由最新的线程调用.
struct callable
{
void operator()();
};
如果该类必须不可复制,那么可以用boost::ref传递一个Callable对象的引用到构造中.
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x); //参数为X的一份拷贝
} // x is destroyed, but the newly-created thread has a copy, so this is OK
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x)); //参数为X的引用
} // x is destroyed, but the newly-created thread still has a reference
// this leads to undefined behaviour
线程可以用一个函数或callable对象为参数构造,用boost::bind来实现
void find_the_question(int the_answer);
boost::thread deep_thought_2(boost::bind(find_the_question,42));
void print();
boost::thread t=boost::thread(&print);
二.线程接合与脱离
当被销毁时,线程称为脱离(
detached),当线程为脱离(detached)时,线程继续执行直到构造函数中函数或callable对象执行完毕,或程式终止.
void print();
boost::thread t(&print);
t.join();//线程销毁
t.join();//线程已经失效,t不指向任何线程,无作用
std::cout<<boolalpha<<t.joinable()<<std::endl;//print false statement
线程的脱离可以明确调用boost::detach()函数,这种情况下线程为非现脱离线程(now-detached thread),变为非线程(
Not-a-Thread).
boost::thread::join() //如果线程为中断(interrupted),引发boost::thread_interrupted异常.
boost::thread::detach() //不引发异常,如果线程不脱离,线程析构时调用.
posted on 2009-01-22 10:01
L'双鱼 阅读(1949)
评论(0) 编辑 收藏 引用