使用状态机思路解决一个并行问题

题目可以描述为:进程A每轮循环产生一个 H,进程 B 每轮循环产生一个 O,需要保证每产生 3 个元素时都由 2 个 H 和 1 个 O 组成。

朴素的解法:思考哪些数据需要放到临界区,比如产生了几个 H 和 几个 O,当自己的职责完成后,检查是否 H20 了,如果未满足就 wait 或者跳出(只生产一个 H 时)。当满足 H20 时就激活信号量,重置状态。

上面的代码写起来还是比较繁琐的,考虑一下用一个状态机来描述这个问题。状态机如下,当状态为 -1 时,线程应该被阻塞。整个程序只需要纪录一个当前状态,代码简单逻辑清晰。

StateHO
0 {}14
1 H32
2 HO0-1
3 HH-10
4 O2-1