Linux スレッド間の同期と排他制御の知識ポイントのまとめ

Linux スレッド間の同期と排他制御の知識ポイントのまとめ

スレッドが同時に実行される場合、スレッドがリソースを競合してデータの曖昧さが生じるのを防ぐために、重要なリソースへの安全なアクセスを確保する必要があります。

スレッド同期: 条件変数

条件変数を使用する理由は何ですか?

クリティカルリソースのタイミング制御性については、条件が満たされると、シグナルと同様に、クリティカルリソースの操作を待機している他のスレッドに通知されます。 シナリオ: T-DAY展示会の行列/生産者-消費者モデル

条件変数とは何ですか?

これは同期メカニズムです。1つのスレッドを使用してこの変数を変更し、他のスレッドが実行を継続するための条件を満たし、他のスレッドは条件が変更されたことを示す信号を受信します。

条件変数操作?

初期化と破棄

pthread_cond_wait

条件が満たされない場合、ロックは解除され、待機はブロックされます。この関数はアトミック操作です。1. スレッドを条件待機キューに入れる2. ロックを解除する

条件が満たされると、スレッドが起動され、ロックされます。

pthread_cond_signal 1対1ウェイクアップ

待機キュー内のスレッドを起動する

pthread_cond_broadcast ブロードキャストウェイクアップ

待機キュー内のすべてのスレッドを起動する

待機とロック解除にアトミック操作が必要なのはなぜですか?/条件変数でミューテックスが使用されるのはなぜですか?

pthread_cond_wait のロックは条件変数を保護し、シグナルの見逃しを防ぐためのものであるため、ロック解除の待機がアトミック操作ではない場合、たとえば、スレッド A が最初にロック解除され、CPU タイム スライスがスレッド B に切り替わり、スレッド B がロックして条件変数シグナルを送信し、次にスレッド A に切り替わります。スレッド A は待機時間になる前にシグナルを見逃し、永久にブロックされる可能性があります。したがって、待機とロック解除はアトミック操作である必要があります。

重要なリソースが存在するかどうかを判断するために while ループが必要なのはなぜですか?

1 対多の状況では、プロデューサーがシグナルを送信し、待機中のスレッドが起動されてロックされますが、ロックできるのは 1 つのスレッドのみで、他のスレッドはロックを待機してブロックされます。このスレッドが重要なリソースを使い果たした場合、他のスレッドが判断を下さずに前進し続けるのは不合理です。

シグナルは最初にロック解除する必要がありますか、それとも後でロック解除する必要がありますか?

最初にロックが解除され、ブロックされておらず待機中のスレッドによってロックが取得され、その後重要なリソースが使用される場合、ロック解除後の信号は無意味になり、誤ったウェイクアップになります。

まず、singal が起動し、起動したスレッドがロックを競い合うようにします。Linux では、2 つのキューがあります。1 つは cond_wait で、もう 1 つは mutex_lock です。singal は cond_wait のスレッドを mutex_lock に転送するだけで、ユーザー空間には戻らないため、効率が向上します。

スレッドの相互排他: ミューテックスロック

なぜミューテックスを使用するのですか?

重要なリソースにのみ同時にアクセスし、重要なリソースが変更されないように保護します。 シナリオ: ダフ屋がチケットを奪う

ミューテックスとは何ですか?

これは 0/1 カウンターです。1 は操作に使用できるリソースがあることを意味し、0 は操作に使用できるリソースがないことを意味します。

ミューテックスロック操作?

初期化と破棄

ロック---カウントが1の場合は0に設定して必要な操作を実行します。カウントが0の場合はブロックしてカウントが1になるまで待機します。

ロック解除 --- カウントを1に設定する

以上が今回ご紹介した関連知識の全てとなります。123WORDPRESS.COMをご活用いただき、誠にありがとうございます。

<<:  まだ*を選択しますか?

>>:  Vue実装のカウンターケース

推薦する

JSは星を消すケースを実現する

この記事の例では、星を消すためのJSの具体的なコードを参考までに共有しています。具体的な内容は次のと...

Linux学習におけるmkdirコマンドの詳しい説明

目次序文1. ファイルの概念に関する基礎知識2. mkdir コマンド序文最近、Linux にますま...

XHTML 入門チュートリアル: テキストの書式設定と特殊文字

<br />このセクションでは、XHTML でテキストの書式設定と特殊文字を実装する方法...

Linux で MongoDB のリモート自動バックアップを実装する方法

序文古いプロジェクトを引き継ぐ苦労 - MongoDB クラスターの学習と構築に関する前回の記事を読...

ユーザーエクスペリエンスの76の経験ポイントの要約

ウェブサイト体験の分類1. 感覚体験:快適性を重視した視聴覚体験をユーザーに提供します。 2. イン...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

ReactでuseStateを使用する詳細な例

使用状態useState は、関数コンポーネント内で呼び出すことで、コンポーネントに内部状態を追加し...

Vueでブラウザ共有機能を呼び出す方法

序文Vue(発音は /vjuː/、view に似ています)は、ユーザーインターフェイスを構築するため...

CSS仕様 BEM CSSとOOCSSサンプルコード詳細説明

序文プロジェクト開発中、各人のコーディング習慣が異なるため、記述された CSS コードは十分に構造化...

SQLはLeetCodeを実装します(180.連続した数字)

[LeetCode] 180. 連続した数字少なくとも 3 回連続して出現するすべての数字を検索す...

MySQL で group by を使用すると常にエラー 1055 が発生します (推奨)

MySQL で group by を使用すると常にエラー 1055 が発生するため、原因を確認する...

mysql はインデックスを無効にしますか?

mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...

ネイティブ js はフォームの定期的な検証を実装します (検証後にのみ送信)

以下の機能が実装されています。 1. ユーザー名: onfouc は msg ルールを表示します。o...

VueのVuexの4つの補助機能について

目次1. 補助機能2. 例1. mapState と mapGetters 2. mapMutati...

mysql5.7 のエンコーディングを utf8mb4 に設定する方法

最近、問題に遭遇しました。モバイル端末の絵文字や一部の絵文字は 4 バイトですが、UTF-8 は 3...