C++11thread库
主要用法如下:
void sleep_thread()
{
cout << "enter thread:" << std::this_thread::get_id() << endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
cout << "leave thread:" << std::this_thread::get_id() << endl;
}
std::thread t1(sleep_thread);
std::thread t2(sleep_thread);
std::thread t3(sleep_thread);
t1.join();
t2.join();
t3.join();
其中std::this_thread是获取到当前线程的句柄。
- hardware_concurrency 获取当前支持的并发线程数
- get_id 获取当前线程的id
- join 阻塞等待线程执行完成
- detach 允许线程独立执行
特别注意
没有两个 std::thread 对象会表示同一执行线程; std::thread 不可复制构造 (CopyConstructible) 或可复制赋值 (CopyAssignable) ,但是它可移动构造 (MoveConstructible) 且可移动赋值 (MoveAssignable) 。
互斥锁
C++11中提供了4中互斥锁
- mutex: 独占型互斥量,不能递归使用(重复锁)
- timed_mutex:带超时的独占型互斥量,不可递归使用
- recursive_mutex:递归互斥量,不带超时功能
recursive_timed_mutex:带超时的递归互斥量
简单的例子:
template<class MutexType>
struct Complex
{
MutexType mutex;
int i = 0;
void mul(int x)
{
std::lock_guard<MutexType> lock(mutex);
i *= x;
}
void div(int x)
{
std::lock_guard<MutexType> lock(mutex);
i /= x;
}
void both(int x, int y)
{
std::lock_guard<MutexType> lock(mutex);
mul(x);
div(y);
}
};
Complex<std::mutex> c;
c.mul(100);
c.div(2);
//c.both(1, 2); //std::system 异常
Complex<std::recursive_mutex> rc;
rc.both(10, 10);
另外lock_guard包装的互斥锁是默认作用域消失才可以释放,而unique_lock是可以手动释放。