在Linux内核中,信号量用于为数据的关键部分提供互斥,而Completion变量用于在等待事件的2个线程之间进行同步。为什么不使用信号量进行这种同步呢?使用完成变量比使用信号量有什么优势吗?
您可能要使用补全而不是信号量有两个原因。首先,多个线程可以等待完成,并且可以通过调用来全部释放它们complete_all()。使信号量唤醒未知数量的线程更为复杂。
complete_all()
其次,如果等待线程要取消分配同步对象,则在使用信号量时会出现竞争。也就是说,在使用唤醒线程完成之前,服务员可能会被唤醒并释放对象up()。这场比赛并不存在。(请参阅Lasse的帖子。)
up()