多线程编程中的互斥算法详解
在多处理器编程中,互斥是一种非常普遍的协调形式。本文将深入探讨经典的互斥算法,这些算法通过读写共享内存来实现,虽然在实际中较少使用,但它们能帮助我们理解同步领域中出现的算法和正确性问题。
1. 时间的概念
在并发计算中,对时间的推理至关重要。我们有时希望事件同时发生,有时则希望它们在不同时间发生。为了清晰地描述事件和时间间隔,我们引入了一些简单的词汇和符号。
事件是瞬间发生的,不同的事件发生在不同的时间。线程 A 会产生一系列事件,我们用 $a_j^i$ 表示事件 $a_i$ 的第 $j$ 次发生。如果事件 $a$ 发生的时间早于事件 $b$,则记为 $a → b$,这种先后关系是事件的全序关系。
时间间隔 $(a_0, a_1)$ 是事件 $a_0$ 和 $a_1$ 之间的持续时间。如果间隔 $I_A = (a_0, a_1)$ 的最后一个事件早于间隔 $I_B = (b_0, b_1)$ 的第一个事件,即 $a_1 → b_0$,则记为 $I_A → I_B$,这种关系是间隔的偏序关系。没有这种先后关系的间隔称为并发间隔。
2. 临界区
在单线程系统中, Counter 类的实现是正确的,但在多线程环境中会出现问题。问题出在多个线程同时读取和更新 value 字段时。为了避免这个问题,我们可以将这两行代码转换为临界区,即一次只能由一个线程执行的代码块,这种属性称为互斥。
实现互斥的标准方法是使用 Lock 对象,其接口如下:
超级会员免费看
订阅专栏 解锁全文
1172

被折叠的 条评论
为什么被折叠?



