Dijkstra 在二十世纪六十年代末设计的一种编程架构
Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过
信号将用于同步通过该轨道的火车
火车在进入单一轨道之前必须等待信号灯变为允许通行的状态
火车进入轨道后,会改变信号状态,防止其他火车进入该轨道
火车离开这段轨道时,必须再次更改信号的状态,以便允许其他火车进入轨道
在计算机版本中,信号以简单整数来表示
线程等待获得许可以便继续运行,然后发出信号,表示该线程已经通过针对信号执行 P 操作来继续运行
线程必须等到信号的值为正,然后才能通过将信号值减 1 来更改该值
完成此操作后,线程会执行 V 操作,即通过将信号值加 1 来更改该值
这些操作必须以原子方式执行,不能再将其划分成子操作,即,在这些子操作之间不能对信号执行其他操作
在 P 操作中,信号值在减小之前必须为正,从而确保生成的信号值不为负,并且比该值减小之前小 1
在 P 和 V 操作中,必须在没有干扰的情况下进行运算
如果针对同一信号同时执行两个 V 操作,则实际结果是信号的新值比原来大 2
对于大多数人来说,如同记住 Dijkstra 是荷兰人一样,记住 P 和 V 本身的含义并不重要
但是,从真正学术的角度来说,P 代表 prolagen,这是由 proberen te v erlagen 演变而来的杜撰词,其意思是尝试减小
V 代表 v erhogen,其意思是增加
Dijkstra 的技术说明 EWD 74 中介绍了这些含义
sem_wait(3RT) 和 sem_post(3RT) 分别与 Dijkstra 的 P 和 V 操作相对应
sem_trywait(3RT) 是 P 操作的一种条件形式
如果调用线程不等待就不能减小信号的值,则该调用会立即返回一个非零值
有两种基本信号:二进制信