ホームページ >バックエンド開発 >C++ >C 0x でセマフォを使用せずにスレッドの同期を実現するにはどうすればよいですか?

C 0x でセマフォを使用せずにスレッドの同期を実現するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-19 08:26:17990ブラウズ

How Can Thread Synchronization Be Achieved in C  0x Without Using Semaphores?

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();

  ...
}

比較ミューテックスのみに

このアプローチでは、いくつかの利点があります。ミューテックスを単独で使用する場合と比較した利点:

  • デッドロックにつながる可能性がある、異なるスレッドで同じミューテックスを取得および解放する際のあいまいさがなくなります。
  • スレッド 1 が取得しないことが保証されます。 thread0 の前のミューテックス。
  • ノンブロッキング取得のための追加の try_acquire() メソッドを提供します。

このカスタム セマフォ実装を利用すると、明示的なセマフォ サポートなしで C 0x でスレッド同期を効果的に実現できます。

以上がC 0x でセマフォを使用せずにスレッドの同期を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。