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実装のカウンターケース

推薦する

CSS のサイズと幅と高さのブラウザ解釈の違いに対する解決策

まずは例を見てみましょうコードをコピーコードは次のとおりです。 <!DOCTYPE html ...

JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...

Ubuntu 20.04にSogou入力方式をインストールする詳細な手順

1. Fcitx入力フレームワークをインストールする関連する依存ライブラリとフレームワークは自動的に...

JavaScript の高度なプログラミングの基本参照型

目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...

CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する例

テーマ今日は、CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する方法を説...

Centos7.4 システムに yum ソースから mysql 5.6 をインストールする

システム環境: centos7.4 1. データベースがインストールされているかどうかを確認します。...

Tomcat+Mysql の高同時実行構成の最適化の説明

1.Tomcatの最適化構成(1)Tomcatのcatalina.batを変更するJavaをサーバー...

mysqlはストアドプロシージャを使用してツリーノード取得メソッドを実装します。

図に示すように: テーブルデータこのようなツリーの場合、「Gao Yinrui」の下のすべてのノード...

Docker ベースの ELK ログ システムを構築する方法

背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

WeChatミニプログラムページとコンポーネント間の情報伝達と機能呼び出し

今回は、私自身の開発経験を踏まえて、以下の観点で関連内容を解説します。ページからコンポーネントにデー...

jquery-multiselect を使用した IE6 のバグの解決方法

jquery-multiselect (ドロップダウン ボックスをチェックボックス付きの複数選択コン...

Tomcat の静的ページ (html) で中国語の文字化けが発生する問題の究極の解決策

tomcatでは、jspは文字化けしませんが、htmlの中国語は文字化けします理由はいくつかあります...

Docker に MySQL をデプロイする例

目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...