当前位置: 代码迷 >> 综合 >> boost::Thread线程库的一点总结
  详细解决方案

boost::Thread线程库的一点总结

热度:53   发布时间:2023-11-10 17:45:15.0
                 boost thread线程学习

*使用方法:#include<boost/thread.hpp>

*多个线程共享一个相同的地址空间,多个线程可以同时执行
一个线程的执行时执行一系列的指令
*线程对象的初始化表示激活这个线程,此时线程的可连接的,
有一个独一无二的线程id
*默认构造的线程对象(non-initialized)是不可连接的,
所有不可连接的线程共用一个线程id
*一个可连接的线程移动或者调用join()或detach()时变成不可连接的

*boost::thread类型的对象不可复制,可以移动,可以作为函数的返回类型

*启动线程:

传递可调用类型对象给构造函数boost::thread(callble_type_object);boost::thread(boost::ref(callable_type_object));//对于不能拷贝的对象,使用引用时,要确保引用对象的//生命周期比线程的生命周期长

*线程属性的设置:

通过boost::thread::attributes类,来设置具有可移植性的线程属性

*分离线程:

使用boost::thread对象的detach()成员函数,将线程名和线程本身分离开,此后不能对该线程进行操作了即,放弃对线程的控制权。调用此函数后,线程对象变为不可连接,可以安全的销毁

*连接线程:

使用boost::thread对象的join()成员函数
将本线程执行完毕后销毁,在销毁之前阻塞main线程,调用此函数后,线程对象变为不可连接,可以安全的销毁
[对join的个人理解]:join是结合,加入的意思,这里的join是将本线程合并到主线程中

*获取线程id:

 线程id类型:boost::thread::id获取所在线程id: boost::this_thread::get_id()获取特定线程的id:使用boost::thread对象的get_id()成员函数

*线程中断:

调用boost::thread对象的interrupt()成员函数boost::this_thread::disable_interruption boost::thread_object;//表示本线程不能被中断(在当前作用域中)boost::this_thread::restore_interruption boost::thread_object;//表示本线程可以被中断(在当前作用域中)//此操作一般用在上一个操作的作用域中调用interrupt()函数,并不能立即终止线程,只能待程序运行到中断点时才能中断线程,在boost::Thread4.3这个版本中,
有16个中断点标志,主要是各种join、wait、sleep等线程或条件变量操作,其中
boost::this_thread::interruption_point()仅仅是一个中断点标志,除了响应interrupt()成员函数以外,没有其他的功能
另,线程中断时会抛出boost::thread_interrupted异常,如果异常没有被捕获处理,则本线程会终止运行,但不会被销毁,
若要销毁本线程,还要调用join()成员函数。

*线程礼让:

 调用boost::this_thread命名空间中的非成员函数yield();即boost::this_thread::yield();//放弃当前线程的时间片,允许其他线程运行当前线程等待某个操作时,如果直接用循环判断操作是否结束,这个线程会占满整个CPU时间,此时应该使用yield()让出时间片,一段时间以后,再来判断操作是否执行结束。

*线程等待:

 boost::this_thread::sleep_untill(abs_time);//暂停当前线程,直到abs_timeboost::this_thread::sleep_for(rel_time);//暂停当前线程,暂停时间为rel_time 

*临界区锁定

#include<boost/thread/locks.hpp>
#include<boost/thread/lock_types.hpp>
使用unique_lock来锁定临界区(共享数据),防止竞争条件的发生
Thread库4.0版本(对应boost1.53)已经抛弃了boost::mutex::scoped_lock等嵌套锁,使用boost::unique_lock<boost::mutex>来代替
unique_lock是mutex的封装版本,可以自动的加锁和解锁,当然也可以有用户自己设置加锁和解锁的时机。C++11标准库中已经收录
  相关解决方案