【NJU OS】06 并发控制:同步

线程同步

生产者-消费者问题

99% 的实际并发问题都可以用生产者-消费者解决。

条件变量:万能同步方法

同步问题:分析

任何同步问题都有先来先等待的条件。

线程 join (thread.h, sum.c)

  • 等所有线程结束后继续执行,否则等待

条件变量:实现生产者-消费者

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}

条件变量:实现并行计算

1
2
3
4
5
6
7
8
9
10
void producer() {
P(&empty); // P()返回 -> 得到手环
printf("("); // 假设线程安全
V(&fill);
}
void consumer() {
P(&fill);
printf(")");
V(&empty);
}

信号量

哲学家进餐问题

总结

  • 实现同步的方法
    • 条件变量、信号量;生产者-消费者问题
    • Job queue 可以实现几乎任何并行算法
  • Copyrights © 2019-2024 Hxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信