我正在开发一个使用生产者和消费者线程的 linux 应用程序。这是一个相当成熟的应用程序,我不想过多地改变架构。
生产者和消费者线程通过等待队列链接。这是一个通过 std::queue 以及条件变量和互斥锁实现的类。
现在我希望消费者线程能够派生/执行子进程,并等待子进程完成或等待队列非空,以先发生者为准。如果等待队列不为空,则必须终止子进程。编辑:子进程是无法更改的第三方应用程序。
一种可能性是当子进程终止时在我的条件变量上调用 pthread_cond_signal() ,但如何实现呢?我不能使用 SIGCHLD 的处理程序,至少不能直接使用,因为手册页说 pthread_cond_signal() 不能从信号处理程序中使用。
一种可能的方法是生成子进程,然后启动一个线程到阻塞的 waitpid(),最后是 pthread_cond_signal()。不过,这似乎有点笨拙:我真的需要生成一个线程来监视 pid 吗?
对于混合 waitpid 和 select/poll/epoll 有Self Pipe Trick。混合 waitpid 和条件变量是否有任何等价物?
注 1:在某些实现中,SIGCHLD 会中断条件变量等待函数。这不是可移植的,如果可能的话,我宁愿不依赖这种行为。
注意 2:由于条件变量封装在可等待队列类中,我需要扩展此类以允许应用程序向互斥体发出信号。这只是一个微不足道的实现细节,我在我的问题中已经掩饰了。