分类: C/C++
2015-06-28 11:19:00
boost::thread的使用
首先确定安装了boost,ubuntu采用:sudo apt-get install libboost-dev
再安装:sudo apt-get install libboost-thread-dev
1 编写如下文件:
点击(此处)折叠或打开
2 boost::thread可以接收一个函数对象作为参数 ,函数对象会被拷贝进线程空间,那么这里就要注意一个问题:拷贝语义,若必要请采用深拷贝
点击(此处)折叠或打开
constructor
copy constructor
copy constructor
copy constructor
copy constructor //为什么这么多拷贝????
段错误 (核心已转储) //这里采用深拷贝可以消除段错误
3 可以向thread传递临时函数对象
点击(此处)折叠或打开
show()
5 thread还可以结合lambda表达式使用(lambda表达式不熟悉~待完善)
线程可能先于join完成,此时仍joinable
点击(此处)折叠或打开
thread show()
joinable
6 当detach线程后,线程生命周期可能长于thread对象
点击(此处)折叠或打开
thread show
7 当一个thread对象销毁前,必须显示的指定是join还是detach线程(必须保证join和detach的正确即使在异常抛出中。在thread对象销毁前作这个是join还是detach),否则一旦线程对象销毁后,thread析构函数对调用terminate()结束线程。如下:
点击(此处)折叠或打开
main exit
thread::fun()
thread::fun() //子线程并没有输出5个thread::fun()说明被提前terminate了
8 如果不等待线程完成,一定要确保线程存取的对象是有效的。比如:当线程函数持有一个局部变量的引用或指针时,但是这个局部变量缺被销毁了。
点击(此处)折叠或打开
oops() 0 //局部对象已经被销毁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //预想是输出1-100的数。
9 采用c++11重写演示上面程序:
点击(此处)折叠或打开
oops() 01 2 3 4 5 6 7 8 9 10
说明:子线程my_thread被分离后,oops()退出使局部对象my_func析构了(local也销毁了),此时子线程调用do_something()访问一个已经销毁的对象,从而错误。解决的办法是:子线程将数据拷贝到自己空间,从而替代共享数据的访问。这个问题类似于对象生命周期的管理,出现了析构竞态,也可以采用boost::shared_ptr管理对象的生命周期。