1、7种互斥量类型
mutex
try_mutex(为兼容以前版本)
timed_mutex
recursive_mutex
recursive_try_mutex(为兼容以前版本)
recursive_timed_mutex
shared_mutex
2、mutex基本用法:
mutex mu;
try
{
mu.lock();
......
mu.unlock();
}
catch(...)
{
mu.unlock();
}
使用RAII的lock_guard
mutex mu;
mutex::scoped_lock lock(mu);
.......
3、thread
thread对象不可copy
创建线程:要传一个无参的函数或函数对象,如不是无参,thread的构造支持直接传递所需参数,最多支持9个参数,是用拷贝方式,要传引用,要用ref库,同时初调用的对象在线程执行期一直存在。
如thread t(线程函数名,ref(引用参数),拷贝参数,....)
等待线程结束
t.join();
t.timed_join(posix_time::seconds(1));
与执行体分离
t.detach();
使用bind和function
bind将函数所需的参数绑定到一个函数对象,而function可存储bind表达式的结果
thread t(bind(函数名,参数,...));
function<void()> f = bind(函数名,参数...);
thread(f);
线程操作:
get_id()反回线程id对象,线程id有比较和流输出操作,可用标准容器来管理线程。
yield():放弃时间片
sleep():等待一小段时间
hardware_concurrency():得到硬件可并行的线程数量。
interrupt():中断线程,抛出thread_interrupted异常
线程执行到中断点的时候才能中断
thread定义了9个中断点:thread::join(),timed_join(),
condition_variable::wait(),timed_wait();
condition_variable_any::wait(), timed_wait();
thread::sleep();
this_thread::sleep(), interruption_point();
缺省线程允许中断的,也可以控制中断行为:
interruption_enabled():检测当前线程是否允许中断
interruption_requested():检测当前线程是否被要求中断;
disable_interruption是一个RAII对象,构造关闭中断,析构恢复,可用restore_interruption打开
thread_group类用于管理一组线程
条件变量:condition_variable,condition_variable_any,
使用:先锁定互斥量,然后wait()条件,其他线程处理条件变量要求的条件,用nofify_one和notify_all()通知
future:异步调用
boost::packaged_task<int> pt(boost::bind(fab, 10));//fab是一个函数,10是参数
boost::unique_future<int> uf =pt.get_future();
boost::thread(boost::move(pt));
uf.wait();
assert(uf.is_ready() && uf.has_value());
std::cout << uf.get() << std::endl;
可以使用多个future,对应有wait_for_any()和wait_for_all()
promise:包装一个值,适用于从函数参数返回值的函数。
et