<aside> 📖 实现同步的方法
不要 “自作聪明” 设计算法,小心求证
</aside>
<aside> 📖 同步 (Synchronization)
两个或两个以上随时间变化的量在变化过程中保持一定的相对关系
</aside>
<aside> 📖 线程同步
在某个时间点共同达到互相已知的状态
并发程序的步调很难保持 “完全一致”
</aside>
99% 的实际并发问题都可以用生产者-消费者解决**。**
<aside> 📖 生产者
生产资源 (任务)、放入队列
</aside>
<aside> 📖 消费者
从队列取出资源 (任务) 执行
</aside>
任何同步问题都有先来先等待的条件。
wait(cv, mutex)
💤
调用时必须保证已经获得 mutex
释放 mutex、进入睡眠状态
signal/notify(cv)
💬 私信:走起
如果有线程正在等待 cv,则唤醒其中一个线程
broadcast/notifyAll(cv)
📣 所有人:走起
唤醒全部正在等待 cv 的线程
void Tproduce() {
mutex_lock(&lk);
if (count == n) cond_wait(&cv, &lk);
printf("("); count++; cond_signal(&cv);
mutex_unlock(&lk);
}
void Tconsume() {
mutex_lock(&lk);
if (count == 0) cond_wait(&cv, &lk);
printf(")"); count--; cond_signal(&cv);
mutex_unlock(&lk);
}
在需要等待条件满足时:
mutex_lock(&mutex);
while (!cond) {
wait(&cv, &mutex);
}
assert(cond);
// ...
// 互斥锁保证了在此期间条件 cond 总是成立
// ...
mutex_unlock(&mutex);