3

私の理解でpthread_cond_tは、これはシグナル オブジェクトであり、Windows プラットフォームのイベントに似ています。

したがって、の基本機能はpthread_cond_tそれを待って通知する必要があります。インターフェイスは次のようになります。

int pthread_cond_wait(pthread_cond_t* cone);
int pthread_cond_singal(pthread_cond_t* cond);

しかし実際には、その機能に直接関係しない型パラメーターがpthread_cond_wait必要です。mutex*したがって、同じデータに同時にアクセスしないスレッド間の通信用のシグナルを作成したいだけでも、ミューテックスが必要です。

では、なぜインターフェイスをそのまま設計し、最終的にユーザーにオーバーヘッドを追加するのでしょうか?

Edit1: 条件付きデータを保護するためにミューテックスが使用されていることは知っていますが、ミューテックスを使用せずにインターフェイスを設計する場合は、ミューテックスと pthread_cond を組み合わせることで目標を達成することもできます。また、データを共有していないpthread_cond他のスレッドに通知するために使用することもできます。

たとえば、ファイルを作成し、終了後に別のコンシューマーにファイルを処理するよう通知するプロデューサー スレッドを作成できます。データをミューテックスで保護する必要はありません。

4

2 に答える 2

1

あなたの前提は間違っています。ミューテックスによって保護された述語がなければ、条件変数を正しく使用することはできません。

たとえば、ファイルを作成するプロデューサー スレッドを作成し、終了後に別のコンシューマーにファイルを処理するよう通知することができます。ミューテックスによってデータを保護する必要はありません。

だからあなたはこれを提案しています:

プロデューサー:
1. ファイルを作成します。
2. 信号条件変数。

消費者:
1. ファイルを確認します。
2. 存在する場合は停止します。
3. 条件変数でブロックします。
4. 手順 1 に進みます。

それはうまくいきません。コンシューマーがステップ 2 を終了し、プロデューサーがステップ 1 と 2 を実行した場合はどうなるでしょうか? コンシューマーはステップ 3 に進み、決して来ないシグナルを待ちます。条件変数はステートレスであるため、シグナルは「保存」されません。状態は自分で維持する必要があり、その状態は必然的に共有されるため、ミューテックスによって保護する必要があります。

よくある誤った考えpthread_cond_waitは、それが条件付き待機であるというものです。そうではない。これは、条件の無条件待機です

于 2014-03-04T13:27:15.213 に答える