In [1]:
from mosaic import *
OS2023(10)

10. 并发控制:同步 (2)¶

Changelog & 反馈

  • 反馈:括号模型消灭了并行的可能性?
  • 课堂展示 model 代码不再有讨厌的黄线
  • thread.h 和 thread-sync.h 可以按任意顺序引用

背景回顾:我们分析了同步的本质需求:两个并发的线程等待某个同步条件达成,完成时间线的 “交汇”。相应地,我们有了条件变量实现同步,并且解决了生产者-消费者问题 (括号打印问题)。

本讲内容:另一种共享内存系统中常用的同步方法:信号量 (E. W. Dijkstra)

  • 什么是信号量
  • 信号量适合解决什么问题
  • 哲 ♂ 学家吃饭问题
In [2]:
slideshow('10.1')
In [3]:
demo('pc-sem', 'c/pc-sem.c', libs=['thread.h', 'thread-sync.h'])
In [4]:
model('m/pc-sem.py', check=True)
 1N, Tp, Tc = 2, 3, 3
 2
 3def Tproduce(nm):
 4  while not (heap.empty > 0):  # P(empty)
 5    sys_sched()
 6  heap.empty -= 1
 7  sys_sched()
 8
 9  sys_write('(')
10  sys_sched()
11
12  heap.fill += 1  # V(fill)
13
14def Tconsume(nm):
15  while not (heap.fill > 0):  # P(fill)
16    sys_sched()
17  heap.fill -= 1
18  sys_sched()
19
20  sys_write(')')
21  sys_sched()
22
23  heap.empty += 1  # V(empty)
24
25def main():
26  heap.fill = 0
27  heap.empty = N
28
29  for i in range(Tp):
30    sys_spawn(Tproduce, f'Tp{i+1}')
31  for i in range(Tc):
32    sys_spawn(Tconsume, f'Tc{i+1}')
33
34# Outputs:
35# (()())
36# (())()
37# ()(())
38# ()()()