我正在 Linux 上同步读取器和写入器进程。
我有 0 个或多个进程(读者)需要休眠,直到它们被唤醒、读取资源、返回休眠状态等等。请注意,我不知道随时有多少个读者进程启动。
我有一个进程(编写器),它在资源上写入,唤醒读者并执行其业务,直到另一个资源准备好为止(详细来说,我开发了一个不饥饿的读者-编写器解决方案,但这并不重要)。
为了实现睡眠/唤醒机制,我使用 Posix 条件值 pthread_cond_t。客户端对变量调用 pthread_cond_wait() 来休眠,而服务器则执行 pthread_cond_broadcast() 来唤醒它们。正如手册所述,我用关联的 pthread 互斥锁的锁定/解锁来包围这两个调用。
条件变量和互斥体在服务器中初始化,并通过共享内存区域在进程之间共享(因为我不使用线程,而是使用单独的进程),我确信我的内核/系统调用支持它(因为我检查过_POSIX_THREAD_PROCESS_SHARED)。
发生的情况是第一个客户端进程完美地睡眠和唤醒。当我启动第二个进程时,它会阻塞其 pthread_cond_wait() 并且never醒来,即使我确定(通过日志)调用了 pthread_cond_broadcast() 。
如果我终止第一个进程并启动另一个进程,它就会完美运行。换句话说,条件变量 pthread_cond_broadcast() 似乎一次只唤醒一个进程。如果多个进程等待同一个共享条件变量,则只有第一个进程能够正确唤醒,而其他进程似乎只是忽略广播。
为什么会有这种行为?如果我发送 pthread_cond_broadcast(),every等待进程应该被唤醒,而不仅仅是一个(但是,并不总是同一个)。
你set the PTHREAD_PROCESS_SHARED属性在你的 condvar 和 mutex 上?
对于Linux请参阅以下内容man
pages:
-
pthread_mutexattr_init(有样品)
- pthread_mutexattr_setpshared
- pthread_condattr_init
- pthread_condattr_setpshared
方法、类型、常量等通常定义在/usr/include/pthread.h
, /usr/include/nptl/pthread.h
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)