一.thread线程的创建
1.线程就是在进程空间中运行的一个函数
2.线程创建时需要传递给thread对象一个函数对象或函数
3.传递的函数有参数时,可以直接传递给thread对象,并在调用时候发生拷贝。
4.参数较大时,可以传递给线程一个引用值,需要使用ref库进行封装。引用的对象在线程执行时一直存在
二.下面我们来看个简单的例子
#include <boost/bind.hpp> #include <boost/thread/thread.hpp> #include <iostream> void hello(char* data) { std::cout << "Hello world, I'm a thread!" << data << std::endl; } int main(int argc, char* argv[]) { char* data = "nihao!"; boost::thread thrd(&hello,data);//线程中传入函数hello 地址,并传入参数data //boost::thread thrd(boost::bind(hello,data)); thrd.join(); return 0; }
boost::thread thrd(&hello,data),也可以传入函数对象,boost::thread thrd(hello,data),当然也可以使用boost::bind的形式来传入函数的参数。为了防止程序的终止,需要对新建的线程调用join()方法。join()方法是一个阻塞调用,暂停当前的线程,一直等到调用join()函数的线程运行结束。上例子中的main()函数会一直等待到thread()运行结束。
三.线程的中断
thread中的成员函数,允许运行的线程被中断,被中断的线程会抛出一个异常,thread_interrupt,这是一个空的类,应该在线程的catch中捕捉,并处理。如果不处理,默认是终止线程。
下面来看一个简单的例子:
#include <boost/thread.hpp> #include <iostream> void wait(int seconds) { boost::this_thread::sleep(boost::posix_time::seconds(seconds)); } void thread() { try { for (int i = 0; i < 5; ++i) { wait(1); std::cout << i << std::endl; } } catch (boost::thread_interrupted&) { std::cout << "--this is interrupt--!" <<std::endl; } } int main() { boost::thread t(thread); wait(3); t.interrupt(); t.join(); }
上面例子的运行结果:
只打印0 和1,打印2时,线程调用interrupt(),中断该线程,线程运行终止。catch()中可以捕捉到中断抛出的异常,上例子中的catch()不做任何操作,由于thread函数在捕捉到异常后,处理完后程序返回,线程也被终止了。这样main()函数中的t.join()会回收该线程,终止整个程序。