一.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()会回收该线程,终止整个程序。