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

ブーストを使用せずに C 0x でセマフォを実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-18 18:55:14
オリジナル
986 人が閲覧しました

How Can I Implement Semaphores in C  0x Without Using Boost?

セマフォを使用しない 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート