thread
thread库需要chrono库提供时间概念来执行睡眠、等该操作。因此必须先编译chrono库
一、
mutex(互斥量):可以在多线程环境里面防止多线程同时操作共享资源。
thread提供了6种互斥量:
null_mutex:无任何锁定功能的互斥量
mutex:独占式互斥量,最简单实用。
timed_mutex:独占式互斥量,提供超时锁定功能。
recursive_mutex:递归式互斥量,可以多次锁定,同时需要多次解锁。
recursive_timed_mutex:
shared_mutex:C++14,读写锁
这些互斥量除了功能不同外基本接口都比较接近。
mutex用法:
boost::mutex mu;
try
{
mu.lock();//用于线程阻塞等待直到获取互斥量的所有权
//操作共享资源
mu.unlock();
}
catch ()
{
mu.unlock();
}
注:使用try catch 以防异常发生,未调用unlocks
timed_mutex用法:
boost::timed_mutex mu;//定时互斥量
auto flag = mu.try_lock_for(100_ms);//等待100ms
if(flag)//检查是否成功解锁互斥量
{
cout << "lock mutex"<<endl;
mu.unlock();
}
...//未能解锁,执行其他操作
二、lock_guard(RAII)
辅助锁定互斥量,构造时候锁定互斥量,解析时候自动解锁,不可拷贝
mutex mu;
lock_guard<mutex> g(mu);//第一种构造形式
//执行操作
timed_mutex mu;
if(mu.try_lock_for(100ms))
{
lock_guard<time_mutex> g(mu,adopt_lock);//第二种构造形式,认为线程之前已经锁定mutex,不会再执行锁定,但是会解锁。
//访问共享资源
}
unique_lock
注:工作机制和guard_lock相同,但是更加复杂,构造函数还可以接受其他的锁定选项,从而有不同的行为。