共享锁
C++17提供。
也是读写锁,shard_lock允许多个读操作,lock_guard即不允许写,也不允许读
// 共享锁,读写场景多用
// 共享锁是shared_mutex,通过锁定方式来决定是读是写,
// 读用shard_lock锁定,这样不会阻塞其他读,但是会阻塞写
// 写用lock_guard或者unique_lock锁定,会阻塞其他读和其他写
//
#include <vector>
#include <shared_mutex>
#include <thread>
using namespace std;
vector<int> data;
shared_mutex m; // C++17
void fun_read()
{
shared_lock lk(m); // 上读锁
// read data;
}
void fun_write()
{
lock_guard lk(m); // 上写锁
// write data;
}
条件变量
没有达到条件,线程非阻塞等待,条件满足来通知线程。
// 条件变量,实现线程之间的同步(线程之间本来异步)
#include <condition_variable>
#include <mutex>
#include <thread>
#include <queue>
using namespace std;
mutex mut; // 互斥锁
condition_variable cond; // 条件变量
queue<int> data;
void data_preparation_thread()
{
lock_guard<mutex> lk(mut);
data.push(1);
cond.notify_one(); // 随机唤醒一个线程
}
void data_work_thread()
{
// 这里必须使用unqiue_lock,不能使用lock_guard
// 因为这里必须有上锁解锁操作,lock_guard没有这些操作.
// 上锁,检查条件变量是否满足
unique_lock<mutex> lk(mut);
// 拿锁检查条件,如果为true,执行work,如果为false,解锁等待,让其他线程运行
/**
* 这里是用lambda表达式作为条件判断,wait只会在互斥量已经锁定的情况下检查条件
* 如果条件为ture,直接返回
* 如果为false,它可能会检查多次,并且次数和频率是不确定的
*/
cond.wait(lk,[]{
if(true)});
/*work*/
// ....
lk.unlock();
}