ホームページ >バックエンド開発 >C++ >ネイティブ サポートなしで C 0x にセマフォ機能を実装するにはどうすればよいですか?

ネイティブ サポートなしで C 0x にセマフォ機能を実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 14:39:15563ブラウズ

How Can I Implement Semaphore Functionality in C  0x Without Native Support?

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 サイトの他の関連記事を参照してください。

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