首頁 > 後端開發 > C++ > 如何在不使用 Boost 的情況下在 C 0x 中實現信號量?

如何在不使用 Boost 的情況下在 C 0x 中實現信號量?

Barbara Streisand
發布: 2024-12-18 18:55:14
原創
984 人瀏覽過

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

沒有信號量的 C 0x 中的同步

C 0x 引入了原子變量和條件,但缺乏顯式信號量支持。這引發了人們對如何在不使用 Boost 信號量實現的情況下有效同步執行緒的擔憂。

一種方法涉及利用互斥體和條件變數的組合來建立自訂訊號量。考慮以下範例:

#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。

這種方法提供了一種簡單而有效的方法來在 C 0x 中實現信號量,而無需使用 Boost。它的功能與 POSIX 信號量類似,允許線程同步其執行並有效地傳達事件。

以上是如何在不使用 Boost 的情況下在 C 0x 中實現信號量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板