Linuxの条件変数とセマフォの違いは何ですか

青灯夜游
リリース: 2022-05-11 19:18:34
オリジナル
5994 人が閲覧しました

違い: 1. 条件変数を使用すると、すべてのウェイターを一度にウェイクアップできますが、セマフォはウェイクアップできません; 2. セマフォは常に値 (ステータス) を持ちますが、条件変数には値がなく、場所もありませんwait によって返されたシグナルの数を記録する場所がない; 3. セマフォの目的はプロセス間の同期であり、条件変数の目的はスレッド間の同期です。

Linuxの条件変数とセマフォの違いは何ですか

#このチュートリアルの動作環境: 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート