Missmiaom
3/20/2020 - 6:11 AM

condition_variable

condition_variable

用于线程间同步

wait

std::condition_variable 需要配合 std::unique_lock 使用。

std::mutex mutex;
std::condition_variable cv;

bool ready() { return ready;}

...

//声名 unique_lock
std::unique_lock lock(mutex);

//释放lock,并等待被唤醒
//如果被其他线程唤醒,则需要对lock进行上锁,然后 return
cv.wait(lock)

//只有当前置条件 ready 为 false 时,才会进入等待状态
//如果被其他线程唤醒,只有当前置条件 ready 为 true 时,才会去加锁并 return
//能够有效避免虚假唤醒
cv.wait(lock, ready);

//等价于
wahile (!ready()) wait(lock);

notify

//随机唤醒一个等待的线程
cv.notify_one();

//唤醒所有等待的线程
cv.notify_all();

惊群效应

场景

  1. accept惊群:多个线程或进程同时 accept 一个套接字
  2. epoll惊群:多线程使用一个epoll实例监听一个套接字,多线程使用多个epoll实例监听一个实例
  3. 条件变量惊群:多个线程共用一个条件变量,同时被唤醒

规避方法

  1. linux 内核已解决
  2. SO_RESUE_PORT
  3. 互斥锁

虚假唤醒

条件变量和互斥锁同步时序造成的假唤醒,需要使用循环判断前置条件规避虚假唤醒。