同時プログラミングでは、データ競合を防ぐために相互排他とクリティカル セクションが使用されます。 Mutex は、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにするデータ構造です。具体的な実装は次のとおりです。 アトミック タグを使用して Mutex クラスを定義します。ロックするには test_and_set() メソッドを使用し、ロックを解除するには clear() メソッドを使用します。クリティカル セクションは、一度に 1 つのスレッドによってのみ実行できるコードのセクションです。具体的な実装は次のとおりです。ミューテックスを宣言します。 lock_guard ラッパーを使用して、重要なセクションの共有リソースにアクセスします。
並行プログラミングでは、複数のスレッドが共有リソースに同時にアクセスすると、データ競合を防止し、データの一貫性を確保します。ミューテックスとクリティカル セクションは、これを実現する 2 つの一般的な方法です。
相互排他は、一度に 1 つのスレッドだけが共有リソースにアクセスできるようにするデータ構造です。相互排他は通常、次の方法を使用して実装されます。
class Mutex { private: std::atomic_flag flag; public: void lock() { while (flag.test_and_set(std::memory_order_acquire)); } void unlock() { flag.clear(std::memory_order_release); } };
クリティカル セクションとは、常に 1 つのスレッドだけが実行できるコードのセクションです。クリティカル セクションの実装では通常、次の構文が使用されます。
std::mutex mutex; void critical_section() { std::lock_guard<std::mutex> lock(mutex); // 共享资源的访问 }
複数のスレッドによって同時にインクリメントできる共有カウンターを含むプログラムを考えてみましょう。相互排他を使用してカウンタを保護します:
Mutex counter_mutex; int counter = 0; void increment_counter() { counter_mutex.lock(); counter++; counter_mutex.unlock(); }
クリティカル セクションを使用してカウンタを保護します:
std::mutex counter_mutex; void increment_counter() { std::lock_guard<std::mutex> lock(counter_mutex); counter++; }
相互排他またはクリティカル セクションを使用すると、1 つのスレッドだけがその時点でカウンタを変更することが保証されます。同時に、データ競合を防ぐことができます。正しい選択は、特定のアプリケーションのパフォーマンスと複雑さの要件によって異なります。
以上が同時プログラミングにおける C++ 関数の相互排除とクリティカル セクションの実装?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。