一、简介
互斥量是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据.
std::mutex: 独占的互斥量,不能递归使用.
std::timed_mutex: 带超时的独占互斥量,不能递归使用.
std::recursive_mutex: 递归互斥量,不带超时功能.
std::recursive_timed_mutex: 带超时的递归互斥量.
这些互斥量的基本接口十分相近,都是通过lock()来阻塞线程,直到获得互斥量的所有权为止.在线程或的互斥量并完成任务后,就必须使用unlock()来解除对互斥量的占用,lock和unlock必须成对出现.try_lock()尝试锁定互斥量,成功返回true,失败返回false,他是非阻塞的.
二、示例
示例包括:
1、使用lock加锁和unlock解锁
2、使用lock_guard:用到了RAII的技术,这种技术在类的构造函数中分配资源,在析构函数中释放资源,保证资源在出了作用域之后就释放。
#include "stdafx.h"
static std::mutex g_lock;
void lock_unlock()
{
//上锁
g_lock.lock();
cout << "in id: " << this_thread::get_id() << endl;
this_thread::sleep_for(chrono::seconds(1));
cout << "out id: " << this_thread::get_id() << endl;
//解锁
g_lock.unlock();
}
void f_lock_guard()
{
//lock_guard在构造时会自动锁定互斥量,而在退出作用域后进行析构时就会自动解锁.
lock_guard<std::mutex> lock(g_lock);
cout << "in id: " << this_thread::get_id() << endl;
this_thread::sleep_for(chrono::seconds(1));
cout << "out id: " << this_thread::get_id() << endl;
}
int mutex_demo()
{
std::thread t1(lock_unlock);
std::thread t2(lock_unlock);
std::thread t3(lock_unlock);
t1.join();
t2.join();
t3.join();
std::thread t4(f_lock_guard);
std::thread t5(f_lock_guard);
std::thread t6(f_lock_guard);
t4.join();
t5.join();
t6.join();
return 0;
}