セマフォを使用しない C 0x での同期
C 0x ではアトミックな変数と条件が導入されていますが、明示的なセマフォのサポートがありません。このため、Boost のセマフォ実装を使用せずにスレッドを効果的に同期する方法について懸念が生じています。
1 つの方法では、ミューテックスと条件変数の組み合わせを利用してカスタム構築のセマフォを作成します。次の例を考えてみましょう:
#include <mutex> #include <condition_variable> class semaphore { std::mutex mutex_; std::condition_variable condition_; unsigned long count_ = 0; // Initialized as locked. public: void release() { std::lock_guard<decltype(mutex_)> lock(mutex_); ++count_; condition_.notify_one(); } void acquire() { std::unique_lock<decltype(mutex_)> lock(mutex_); while (!count_) // Handle spurious wake-ups. condition_.wait(lock); --count_; } bool try_acquire() { std::lock_guard<decltype(mutex_)> lock(mutex_); if (count_) { --count_; return true; } return false; } };
この実装では、ミューテックス (mutex_) を利用して内部データへのアクセスを保護し、条件変数 (condition_) を利用してセマフォが解放されたときに待機中のスレッドに信号を送ります。 count_ メンバー変数はゼロに初期化され、初期ロック状態を示します。
セマフォを解放する (つまり、取得できるようにする) には、release() メソッドはカウントをインクリメントし、待機中のスレッドに通知します。セマフォを取得するために、acquire() メソッドはカウントがゼロ以外になるまで待機します。 try_acquire() メソッドは、セマフォをノンブロッキングで取得しようとし、成功した場合は true、そうでない場合は false を返します。
このアプローチは、Boost を使用せずに C 0x でセマフォを実装する簡単かつ効率的な方法を提供します。機能的には POSIX セマフォに似ており、スレッドが実行を同期し、イベントを効果的に通信できるようになります。
以上がブーストを使用せずに C 0x でセマフォを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。