Linux上的pthread条件变量,异常行为

我正在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中定义.

上一篇:java-为NavigableMap编写同步的线程安全包装器


下一篇:c-互斥体所有权队列顺序