違い: 1. 条件変数を使用すると、すべてのウェイターを一度にウェイクアップできますが、セマフォはウェイクアップできません; 2. セマフォは常に値 (ステータス) を持ちますが、条件変数には値がなく、場所もありませんwait によって返されたシグナルの数を記録する場所がない; 3. セマフォの目的はプロセス間の同期であり、条件変数の目的はスレッド間の同期です。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
条件変数
条件変数 (cond) は、マルチスレッド プログラムで「待機 ---> ウェイクアップ」ロジックを実装するために使用されます。一般的に使用される方法は、プロセス間の同期メカニズムです。条件変数は、条件が満たされてトリガーされるまでスレッドをブロックするために使用されます。通常、条件変数とミューテックスは同時に使用されます。
一般に、条件変数には 2 つの状態があります:
(1) 1 つまたは複数のスレッドが「条件変数の条件が確立される」のを待って一時停止されます;
(2 ) 別のスレッドは、「条件変数の条件が true の場合」に他のスレッドに通知します。
条件変数の使用:
#include <pthread.h> struct msg { struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); }
もちろん、条件変数をトリガーするときに次のコードを使用することもできます。どちらの方法にも独自の長所と短所があります
void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }
セマフォ
セマフォは、アクセスがアトミックである特別な変数です。
これに対して許可される操作は 2 つだけです:
(1) セマフォを待つ
セマフォ値が 0 の場合、プログラムは待機し、セマフォ値が大きい場合は待機します。 0 より大きい場合、セマフォは 1 減算され、プログラムは実行を続けます。
(2) セマフォを送信します。
セマフォの値に 1 を加えます。
注: Linux は、ヘッダー ファイル sys/sem.h で宣言された一連のセマフォ API を提供します。
Linux 条件変数とセマフォの違い:
(1) 条件変数を使用すると、すべてのウェイターを一度にウェイクアップでき、このセマフォは機能と感触の欠如が最大の違いです。
(2) セマフォは常に値 (ステータス) を持ちますが、条件変数にはそれがありません。何回目覚めた (信号を送信した) かを記録する場所はありません。ウェイクアップされた回数を記録する場所 (wait が返されます)。実装の観点から見ると、セマフォはミューテックス カウンタ条件変数を使用して実装できます。セマフォには状態があるため、正確な同期が必要な場合は、セマフォに特別な機能を持たせることができます。セマフォは、条件変数でウェイクアップが失われる問題を解決できます。
(3) セマフォの目的はプロセス間の同期であり、ミューテックスと条件変数の目的はスレッド間の同期ですが、セマフォはスレッド間でも使用でき、ミューテックスと条件変数も同期できます。間のプロセスで使用されます。実際の状況に基づいて決定を下す必要があります。セマフォの最も便利なシナリオは、利用可能なリソースの量を示すことです。
古典的な文:
ミューテックスはセマフォの特殊なケースであり、ミューテックスの本質はロックです。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinuxの条件変数とセマフォの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。