ホームページ > 記事 > システムチュートリアル > Linux の同期および相互排他メカニズム
マルチプロセスまたはマルチスレッドのオペレーティング システム環境では、同期と相互排他は、共有リソースへの正しいアクセスを保証するために使用される重要な概念です。以下に、同期と相互排他、および相互排他に関する設計原則を示します。 Linux での実装:
同期メカニズムは、複数の実行スレッドまたはプロセスの実行を調整して、それらが特定の順序で実行されるか、特定の条件下で待機するようにするプロセスです。一般的な同期メカニズムには、セマフォ、条件変数、バリアなどが含まれます。
アトミック操作: アトミック操作とは、分割できない操作を指し、すべてが実行されるか、まったく実行されないかのいずれかです。同期では、アトミック操作はスレッドまたはプロセスの安全な実行を保証するために不可欠な要素です。
相互排他: 同期の主な目標は、共有リソースへの相互排他的アクセスを保証することです。つまり、競合状態を避けるために、共有リソースに同時にアクセスできるのは 1 つのスレッドまたはプロセスのみです。
条件待機: 同期メカニズムは通常、条件待機をサポートする必要があります。つまり、スレッドまたはプロセスは特定の条件が満たされるまで待機し、条件が満たされたときに他のスレッドまたはプロセスが待機中のスレッドに通知します。実行は継続してスレッド間の調整を実現します。
順序保持: 同期には、スレッドまたはプロセスが期待された順序で実行されることを保証するための実行順序の制御も含まれる場合があり、それによってプログラムの正確性と信頼性が保証されます。
sem_init
、sem_wait
、sem_post
などの関数を使用して操作されます。 pthread_cond_init
、pthread_cond_wait
、pthread_cond_signal
などの関数を使用して操作されます。相互排他は、共有リソースへの相互排他的アクセスを保証するために使用されるメカニズムです。マルチスレッド環境またはマルチプロセス環境では、ミューテックス ロックが最も一般的な相互排他メカニズムです。
pthread_mutex_init
、pthread_mutex_lock
、pthread_mutex_unlock
などの関数を通じて操作されます。これにより、スレッドが重要なセクションに安全に出入りできるようになります。 spin_lock
および spin_unlock
を介して操作されます。 上記は、Linux で同期と相互排他を実現するための一般的なメカニズムの一部です。具体的な選択は、アプリケーションのニーズと、パフォーマンスと保守性の間のトレードオフによって異なります。
次のサンプル コードでは、ミューテックス (Mutex) と条件変数 (Condition Variable) を使用して、簡単な同期メカニズムを実装する方法を示します。ここでは、POSIX スレッド ライブラリの関連関数が使用されます。
####含む #含む #含む #define BUFFER_SIZE 5 int バッファ[BUFFER_SIZE]; int カウント = 0; pthread_mutex_t ミューテックス = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_Producer = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_consumer = PTHREAD_COND_INITIALIZER; void *プロデューサー(void *arg) { for (int i = 0; i while (count == BUFFER_SIZE) { // バッファーがいっぱいで、消費者による消費を待っています pthread_cond_wait(&cond_Producer, &mutex); } バッファ[カウント] = i; printf("生成されたもの: %d\n", i); // 消費者に消費できることを通知します pthread_cond_signal(&cond_consumer); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } void *consumer(void *arg) { for (int i = 0; i while (count == 0) { // バッファは空で、プロデューサーが生成するのを待っています pthread_cond_wait(&cond_consumer, &mutex); } int item = バッファ[--count]; printf("消費: %d\n", item); // 制作の準備ができたことをプロデューサーに通知します pthread_cond_signal(&cond_Producer); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t プロデューサー スレッド、コンシューマー スレッド; //プロデューサーとコンシューマーのスレッドを作成する pthread_create(&Producer_thread, NULL, プロデューサー, NULL); pthread_create(&consumer_thread, NULL, Consumer, NULL); // スレッドが終了するまで待ちます pthread_join(プロデューサースレッド、NULL); pthread_join(consumer_thread, NULL); // ミューテックスロックと条件変数を破棄します pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond_Producer); pthread_cond_destroy(&cond_consumer); 0 を返します。 }この簡単な例は、プロデューサー/コンシューマー問題を示しています。この問題では、プロデューサー スレッドがバッファーへのデータの生成を担当し、コンシューマー スレッドがバッファーからのデータの消費を担当します。ミューテックス ロック
mutex は共有リソースへの排他的アクセスを保証するために使用され、条件変数
cond_Producer および
cond_consumer はバッファーがいっぱいになるか待機するために使用されます。空と通知。
以下は、Linux で pthread_mutex_t
を使用してミューテックス ロックを実装する方法を示す簡単なサンプル コードです。この例では、2 つのスレッドがカウンターを共有し、ミューテックス ロックによりカウンターへの相互排他的アクセスが保証されます。
この例では、2 つのスレッドが
counter 変数の値を同時にインクリメントします。両方のスレッドが同じ変数を共有するため、競合状態が存在します。ミューテックス ロック
mutex は、
counter への相互排他的アクセスを保証するために使用されます。1 つのスレッドは、
counter にアクセスするときに最初にロックをロックし、完了後にロックを解除します。他のスレッドのスレッドが入る可能性があります。
PTHREAD_MUTEX_INITIALIZER
または pthread_mutex_init
を使用して、ミューテックス ロックを初期化します。 pthread_mutex_lock
を使用し、ロック解除には pthread_mutex_unlock
を使用します。クリティカル セクション内の共有リソースへのアクセスは、ロックとロック解除の間に行う必要があります。 pthread_mutex_destroy
を使用します。 上記のコードは、ミューテックス ロックを使用して共有リソースへの安全なアクセスを確保し、競合状態を防ぐ方法を示しています。
以上がLinux の同期および相互排他メカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。