C 0x セマフォの置換
C 0x はネイティブにセマフォを提供しませんが、スレッド間の同期を達成するための代替アプローチがあります。 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; } };
このカスタム セマフォは、POSIX セマフォと同様の機能を提供し、スレッドを許可します。イベントを待ってリリースします。 release メソッドはカウントをインクリメントして待機中のスレッドに通知し、acquire メソッドはカウントをデクリメントして必要に応じて待機します。 try_acquire メソッドは、待機せずにすぐにセマフォの取得を試みます。
この手法を採用すると、ネイティブ セマフォがサポートされていない場合でも、C 0x でセマフォのような機能を実現できます。
以上がネイティブ サポートなしで C 0x にセマフォ機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。