C 0x セマフォなし: スレッド同期の実現
C 0x にはさまざまな機能拡張が導入されていますが、注目すべき省略の 1 つはセマフォの組み込みです。セマフォはスレッドの同期に不可欠であり、スレッドがイベントを通知してその完了を待機できるようにします。
問題ステートメント
セマフォがない場合、どのようにメカニズムを実装すればよいでしょうか。次の POSIX セマフォに例示されているスレッド同期用使用法:
void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... }
ミューテックスと条件変数を使用した解決策
効果的な方法の 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; } };
使用法
このカスタム セマフォは次の方法で使用できます。
semaphore event1; void thread0(...) { doSomething0(); event1.acquire(); ... } void thread1(...) { doSomething1(); event1.release(); ... }
比較ミューテックスのみに
このアプローチでは、いくつかの利点があります。ミューテックスを単独で使用する場合と比較した利点:
このカスタム セマフォ実装を利用すると、明示的なセマフォ サポートなしで C 0x でスレッド同期を効果的に実現できます。
以上がC 0x でセマフォを使用せずにスレッドの同期を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。