我正在实现 pthread 条件变量(基于 Linux futexes),并且我有一个想法来避免pthread_cond_broadcast
进程共享条件变量的“踩踏效应”。对于非进程共享的 cond var,futex 重新排队操作传统上(即通过 NPTL)用于将等待者从 cond var 的 futex 重新排队到 mutex 的 futex 而不唤醒它们,但这对于进程共享的 cond var 通常是不可能的,因为pthread_cond_broadcast
可能没有指向关联互斥体的有效指针。在最坏的情况下,互斥锁甚至可能不会映射到其内存空间中。
我克服这个问题的想法是pthread_cond_broadcast
只直接唤醒一个服务员,并让该服务员在唤醒时执行重新排队操作,因为它确实具有指向互斥锁的所需指针。
如果我采用这种方法,自然有很多丑陋的竞争条件需要考虑,但是如果可以克服它们,是否还有其他原因导致这种实现无效或不受欢迎?我能想到的一个可能无法克服的潜在问题是负责重新排队的服务员(一个单独的进程)在它可以采取行动之前被杀死的竞争,但是通过放置 condvar 甚至可以克服这个问题futex 在健壮的互斥列表中,以便内核在进程死亡时对其执行唤醒。