プロデューサー スレッドとコンシューマー スレッドを使用する Linux アプリに取り組んでいます。これはかなり成熟したアプリであり、必要以上にアーキテクチャを変更したくありません。
プロデューサ スレッドとコンシューマ スレッドは、待機可能なキューを介してリンクされます。これは、条件変数とミューテックスとともに std::queue を介して実装されるクラスです。
ここで、消費者スレッドが子プロセスを fork/exec できるようにし、子プロセスが終了するか、待機可能なキューが空でなくなるまで待機できるようにしたいと考えています。待機可能なキューが空でない場合は、子プロセスを強制終了する必要があります。編集:子プロセスは、変更できないサードパーティのアプリです。
1 つの可能性は、子プロセスが終了したときに条件変数で pthread_cond_signal() を呼び出すことですが、それを実現するにはどうすればよいでしょうか? man ページには pthread_cond_signal() はシグナル ハンドラからは使用できないと記載されている ため、SIGCHLD のハンドラを少なくとも直接使用することはできません。
考えられる 1 つの方法は、子プロセスを生成してからスレッドを開始してブロックしている waitpid() を実行し、最後に pthread_cond_signal() を実行することです。しかし、これは少し不格好に思えます: pid を監視するためだけに、本当にスレッドを生成する必要がありますか?
waitpid と select/poll/epoll を混在させるには、Self Pipe Trickがあります。waitpid と条件変数を混在させるのに相当するものはありますか?
注 1:一部の実装では、SIGCHLD は条件変数の待機関数を中断します。これは移植性がなく、可能であれば、この動作に依存したくありません。
注 2:条件変数は待機可能なキュー クラス内にカプセル化されているため、このクラスを拡張して、アプリがミューテックスに通知できるようにする必要があります。これは、私の質問で説明した些細な実装の詳細です。