検索
ホームページバックエンド開発PHPチュートリアルLinux -- スレッドの同期と相互排他

1. ミューテックス
同期: 秩序ある方法でリソースにアクセスします。相互排他: 常に 1 つのみが実行されますが、マルチスレッド プログラムの場合、アクセス競合の問題はよく発生します。解決策は、ミューテックス (Mutex、MutualExclusive Lock) を導入し、スレッドが完了できるようにすることです。 「読み取り - 変更 - 書き込み」操作を行った後、ロックを他のスレッドに解放します。このように、ロックを取得していないスレッドは待機することしかできませんが、共有データにアクセスすることはできません。 write" はアトミック操作を形成します。これらをすべて実行するか、まったく実行しないかのどちらでも、実行途中で中断されることはなく、この操作は他のプロセッサーで並行して実行されません。
ミューテックス ロックは、pthread_mutex_t 型の変数で表されます。 pthread_mutex_init で初期化され、hread_destroy() で破棄されます。成功した場合は 0 を返し、失敗した場合はエラー番号を返します。 。ミューテックス変数が静的に割り当てられている場合 (グローバル変数または静的変数)、マクロ定義 PTHREAD_MUTEX_INITIALIZER で初期化することもできます。これは、pthread_mutex_init で初期化するのと同じで、attr パラメーターが NULL です
スレッドは pthread_mutex_lock を呼び出してミューテックスを取得できます。 pthread_mutex_lock を呼び出してミューテックスを取得した後、現在のスレッドはハングして、別のスレッドが pthread_mutex_unlock を呼び出してミューテックスを解放するまで待機する必要があります。現在のスレッドはウェイクアップされてから、ミューテックスを取得して実行を続行できます。これは、スレッドがミューテックスをロックしているがロックを解除しておらず、別のスレッドがミューテックスを取得しようとしている場合、そのスレッドはハングアップして、ロックされたスレッドがミューテックスのロックを解除してミューテックスを解放するまで待つ必要があることを意味します。ミューテックスを取得します。
スレッドがロックを取得したいが、ハングして待機したくない場合は、pthread_mutex_trylock を呼び出すことができます。ミューテックスが別のスレッドによって取得されている場合、この関数は失敗し、スレッドをハングさせることなく EBUSY を返します。そして待ってください。

1 #include<stdio.h>  
  2 #include<stdlib.h>  
  3 #include<pthread.h>  
  4 static int g_count=0;  
  5 void * addWrite(void * arg)  
  6 {  
  7     int count=0;  
  8     int value=0;  
  9     while(count++ <5000)  
 10     {  
 11         value=g_count;  
 12         printf("g_count is %d\n",g_count);  
 13         g_count=value+1;  
 14     }  
 15 }  
 16 int main()  
 17 {  
 18     pthread_t id1;  
 19     pthread_t id2;  
 20     int ret=pthread_create(&id1,NULL,addWrite,NULL);  
 21     int res=pthread_create(&id2,NULL,addWrite,NULL);  
 22     pthread_join(id1,NULL);  
 23     pthread_join(id2,NULL);

2 つのスレッドを作成し、それぞれ g_count を 5000 回増加させます。通常、最終的なカウンターは 10000 になるはずですが、実際にはプログラムを実行するたびに結果が異なります。5000 を超える場合もあれば、5000 までカウントされる場合もあります。 6000を超えていますが、ロックを追加した後、以下に示すように5行目(in)にpthread_mutex_initを追加します

Linux -- スレッドの同期と相互排他

ロックを追加すると、10000が出力されます

2番目、実装原理ロックとロック解除の実現のために、ほとんどのアーキテクチャはスワップ命令または交換命令を提供します。この命令の機能は、命令が 1 つしかないため、アトミック性が保証されています。マルチプロセッサ プラットフォームでは、アクセス メモリ バス サイクルにもシーケンスがあります。あるプロセッサ上のスワップ命令が実行されると、別のプロセッサ上のスワップ命令はバス サイクルを待つことしかできません。これを以下の疑似コードに示します。ロック解除のロック解除操作も、アトミック性を確保するために 1 つの命令のみで実装されます。

Linux -- スレッドの同期と相互排他


3. デッドロック
・通常、同じスレッドが lock を 2 回呼び出した場合、2 回目の呼び出しでは、ロックがすでに占有されているため、スレッドはハングし、他のスレッドがロックを解放するのを待ちます。スレッドが単独で占有され、ロックを解放する機会がないままサスペンドされるため、常にサスペンド待ちの状態になります。これをデッドロックといいます。もう 1 つの典型的なデッドロック状況は次のとおりです。スレッド A がロック 1 を取得し、スレッド B がロック 2 を取得します。このとき、スレッド A はロックを呼び出してロック 2 を取得しようとします。その結果、スレッド A はハングしてスレッド B が解放されるまで待つ必要があります。ロック 2、およびこれ スレッド B もロック 1 を取得しようとして lock を呼び出すと、スレッド A がロック 1 を解放するまで待機する必要があるため、スレッド A と B は両方とも永久にサスペンド状態になります。
デッドロック形成の条件

①. 相互排他条件:リソースは一度に1つのスレッドしか使用できません。

②. リクエストと保持の条件: リソースの要求によりプロセスがブロックされた場合、取得したリソースは保持されます。 Linux -- スレッドの同期と相互排他

③. 非剥奪条件: プロセスによって取得されたリソースは、使い果たされる前に強制的に剥奪することはできません。


④循環待機状態: 複数のプロセス間で先頭から末尾までの循環待機リソース関係が形成されます

より多くのスレッドとより多くのロックが関与すると、デッドロックの問題が発生する可能性が高くなります。プログラムを作成するときは、必要に応じて複数のロックを同時に取得しないようにする必要があります。原則として、すべてのスレッドが複数のロックを必要とする場合は、同じ順序に従う必要があります (最も一般的なのは、 Mutex変数のアドレス順) ロックが取れていればデッドロックは発生しません。たとえば、ロック 1、ロック 2、およびロック 3 がプログラムで使用されており、それらに対応する Mutex 変数のアドレスがロック 1
上記は Linux スレッドの同期と相互排他に関する内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。



声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
どのデータをPHPセッションに保存できますか?どのデータをPHPセッションに保存できますか?May 02, 2025 am 12:17 AM

phpssionscanStorestrings、numbers、arrays、andobjects.1.strings:textdatalikeusernames.2.numbers:integersorfloatsforcounters.3.arrays:listslikeshoppingcarts.4.objects:complextructuresthataresialized。

どのようにPHPセッションを開始しますか?どのようにPHPセッションを開始しますか?May 02, 2025 am 12:16 AM

tostartaphpsession、outsession_start()atthescript'sbeginning.1)placeitbe foreanyouttosetthesscookie.2)usesionsionsionsionserdatalikelogintatussorshoppingcarts.3)再生セッションインドストップレベントフィックスアタック

セッションの再生とは何ですか?また、セキュリティをどのように改善しますか?セッションの再生とは何ですか?また、セキュリティをどのように改善しますか?May 02, 2025 am 12:15 AM

セッション再生とは、新しいセッションIDを生成し、セッション固定攻撃の場合にユーザーが機密操作を実行するときに古いIDを無効にすることを指します。実装の手順には次のものが含まれます。1。感度操作を検出、2。新しいセッションIDを生成する、3。古いセッションIDを破壊し、4。ユーザー側のセッション情報を更新します。

PHPセッションを使用する際のパフォーマンスの考慮事項は何ですか?PHPセッションを使用する際のパフォーマンスの考慮事項は何ですか?May 02, 2025 am 12:11 AM

PHPセッションは、アプリケーションのパフォーマンスに大きな影響を与えます。最適化方法には以下が含まれます。1。データベースを使用してセッションデータを保存して応答速度を向上させます。 2。セッションデータの使用を削減し、必要な情報のみを保存します。 3.非ブロッキングセッションプロセッサを使用して、同時実行機能を改善します。 4.セッションの有効期限を調整して、ユーザーエクスペリエンスとサーバーの負担のバランスを取ります。 5.永続的なセッションを使用して、データの読み取り時間と書き込み時間を減らします。

PHPセッションはCookieとどのように異なりますか?PHPセッションはCookieとどのように異なりますか?May 02, 2025 am 12:03 AM

phpsesionsareserver-side、whilecookiesareclient-side.1)Sessionsionsionsoredataontheserver、aremoresecure.2)cookiesstoredataontheclient、cookiestoresecure、andlimitedinsizeisize.sesionsionsionivationivationivationivationivationivationivationivate

PHPはユーザーのセッションをどのように識別しますか?PHPはユーザーのセッションをどのように識別しますか?May 01, 2025 am 12:23 AM

phpidentifiesauser'ssessionsingsinssessionCookiesIds.1)whensession_start()iscalled、phpgeneratesauniquesidstoredsored incoookienadphpsessidontheuser'sbrowser.2)thisidallowsphptortorieSessiondatadata fromthata

PHPセッションを保護するためのベストプラクティスは何ですか?PHPセッションを保護するためのベストプラクティスは何ですか?May 01, 2025 am 12:22 AM

PHPセッションのセキュリティは、次の測定を通じて達成できます。1。session_regenerate_id()を使用して、ユーザーがログインまたは重要な操作である場合にセッションIDを再生します。 2. HTTPSプロトコルを介して送信セッションIDを暗号化します。 3。Session_Save_Path()を使用して、セッションデータを保存し、権限を正しく設定するためのSecure Directoryを指定します。

PHPセッションファイルはデフォルトで保存されていますか?PHPセッションファイルはデフォルトで保存されていますか?May 01, 2025 am 12:15 AM

phpsessionFilesToredInthededirectoryspecifiedBysession.save_path、通常/tmponunix-likesystemsorc:\ windows \ temponwindows.tocustomizethis:1)uesession_save_path()tosetaCustomdirectory、ensuringit'swritadistradistradistradistradistra

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター