我正在 Linux 上同步读取器和写入器进程。
我有 0 个或多个进程(读者)需要休眠,直到被唤醒、读取资源、重新休眠等等。请注意,我不知道任何时候有多少读取器进程正在运行。我有一个进程(写入者)在资源上写入,唤醒读者并做它的业务,直到另一个资源准备好(详细地说,我开发了一个没有饥饿的读写器解决方案,但这并不重要)。
为了实现睡眠/唤醒机制,我使用了 Posix 条件值 pthread_cond_t。客户端调用变量上的 pthread_cond_wait() 来休眠,而服务器执行 pthread_cond_broadcast() 来唤醒它们。正如手册所说,我用相关 pthread 互斥锁的锁定/解锁来包围这两个调用。
条件变量和互斥锁在服务器中初始化并通过共享内存区域在进程之间共享(因为我不是在使用线程,而是使用单独的进程)我确定我的内核/系统调用支持它(因为我检查了_POSIX_THREAD_PROCESS_SHARED)。
发生的情况是第一个客户端进程完美地休眠和唤醒。当我启动第二个进程时,它会阻塞其 pthread_cond_wait() 并且永远不会唤醒,即使我确定(通过日志)调用了 pthread_cond_broadcast() 也是如此。
如果我杀死第一个进程,然后启动另一个进程,它可以完美运行。换句话说,条件变量 pthread_cond_broadcast() 似乎一次只唤醒一个进程。如果多个进程等待相同的共享条件变量,则只有第一个进程能够正确唤醒,而其他进程似乎忽略了广播。
为什么会有这种行为?如果我发送一个 pthread_cond_broadcast(),每个等待的进程都应该被唤醒,而不仅仅是一个(但是,并不总是同一个)。