我正在Linux上同步读取器和写入器进程.
我有0个或多个进程(读者)需要睡眠,直到他们被唤醒,阅读资源,重新进入睡眠状态等等.请注意,我不知道有多少阅读器进程随时启动.
我有一个过程(作者)在一个资源上书写,唤醒读者并进行业务,直到准备好另一个资源为止(详细地说,我开发了一个没有饥饿的读者-作家解决方案,但这并不重要).
为了实现睡眠/唤醒机制,我使用了Posix条件值pthread_cond_t.客户端调用该变量上的pthread_cond_wait()进入睡眠状态,而服务器执行pthread_cond_broadcast()唤醒它们.如手册所述,我用关联的pthread互斥锁的锁定/解锁来包围这两个调用.
条件变量和互斥锁在服务器中初始化,并通过共享内存区域在进程之间共享(因为我不使用线程,但是使用单独的进程),我确定我的内核/系统调用支持它(因为我检查了) _POSIX_THREAD_PROCESS_SHARED).
发生的情况是第一个客户端进程进入休眠状态并完美唤醒.当我启动第二个进程时,即使我确定(通过日志)已调用pthread_cond_broadcast(),它也会阻塞其pthread_cond_wait()且永不唤醒.
如果我取消第一个进程,然后启动另一个进程,则它会完美运行.换句话说,条件变量pthread_cond_broadcast()似乎一次仅唤醒一个进程.如果有多个进程在相同的共享条件变量上等待,则只有第一个进程能够正确唤醒,而其他进程似乎忽略了广播.
为什么这种行为?如果我发送一个pthread_cond_broadcast(),则每个等待的进程都应该唤醒,而不仅仅是一个(并且,并不总是相同的).
解决方法:
您的condvar和互斥量是否都为set the PTHREAD_PROCESS_SHARED
attribute?
对于Linux,请参考以下手册页:
> pthread_mutexattr_init
(含样品)
> pthread_mutexattr_setpshared
> pthread_condattr_init
> pthread_condattr_setpshared
方法,类型,常量等通常在/usr/include/pthread.h、/usr/include/nptl/pthread.h中定义.