posix 条件变量

跟sigsuspend很相似的一个东西是posix 条件变量

sigsuspend(配合sigprocmask)用来处理由信号修改的临界区,而posix条件变量用来处理由互斥锁保护的临界区。

mutex用来加锁,而cond用来同步,之所以cond要配合mutex使用,原因跟sigsuspend一样,考虑两者无关的情况:

  1. pthread_muxte_lock
  2. 测试变量
  3. 发现变量条件不满足,pthread_mutex_unlock
  4. pthread_cond_wait

假如3和4之间变量的值发生了变化,满足了条件(pthread_cond_signal)并且这个值以后不再变化的话,那么phread_cond_wait就失去对这个情况的监控,永远等待下去。

按照我的理解,pthread_cond_wait大概是这样工作的:

  1. pthread_mutex_lock
  2. 测试变量
  3. 条件不满足,调用pthread_cond_wait, 其内部:
    a. 解锁mutex
    b. 等待条件满足(pthread_cond_signal)
    c. 锁定mutex, 返回
  4. 干活……
  5. pthread_mutex_unlock

……感觉我有点明白了多年前一直难以理解的gdk_threads_enter和gdk_threads_leave了……

updatedupdated2022-02-222022-02-22