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

推薦する

MySQL マスタースレーブレプリケーションの詳細な分析

序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...

CSS3はブラウザのスクロールバーのスタイルを変更します

注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...

Linux に Python クローラー スクリプトを展開し、スケジュールされたタスクを設定する方法

昨年、プロジェクトの必要性により、Python でクローラーを作成しました。クロールされたデータは、...

Linuxプロセスネットワークトラフィック統計の実装プロセス

序文Linux には、ネットワーク接続、プロセス、およびその他の情報をリアルタイムで収集するための対...

HTML ウェブページにおけるさまざまなフォント形式の詳細

このセクションでは、テキストの変更の詳細から始めます。これにより、読者はさまざまな HTML フォン...

DockerにTensorFlow環境を素早くインストールする方法

Docker に TensorFlow 環境をすばやくインストールし、TensorFlow を使用し...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

Vueはユーザーログインとトークン検証を実装します

フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...

MySQL 8.0.21 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.21のインストールと設定方法を記録してみんなで共有します。 1. ダウンロード1...

PXEを使用してCentOS7.6を自動的にインストールする方法の詳細なチュートリアル

1. 需要ベースには 300 台の新しいサーバーがあり、CentOS7.6 オペレーティング システ...

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...

この記事では、CSSのようなJSモジュールをインポートする方法を説明します。

目次序文構築可能なスタイルシートとは何ですか? CSSモジュールスクリプトの使用インポートアサーショ...

Vue+echarts でプログレスバーのヒストグラムを実現

この記事では、プログレスバーヒストグラムを実現するためのvue+echartsの具体的なコードを参考...

テキストエリアの disabled 属性と readonly 属性の具体的な使用法

障害者の定義と使用法disabled 属性はブール属性です。 disabled 属性は、テキスト領域...