Rumah >pembangunan bahagian belakang >C++ >Bolehkah Semaphore C 0x Ditiru Menggunakan Mutexes dan Pembolehubah Keadaan?

Bolehkah Semaphore C 0x Ditiru Menggunakan Mutexes dan Pembolehubah Keadaan?

DDD
DDDasal
2024-12-26 08:08:12123semak imbas

Can C  0x Semaphores Be Emulated Using Mutexes and Condition Variables?

Bolehkah Anda Menggunakan Semaphore dalam C 0x?

Penyegerakan berasaskan semaphore adalah penting untuk komunikasi benang. Dengan ketiadaan semafor dalam C 0x, ia kelihatan seperti kebuntuan.

Emulasi Semaphore dengan Mutex dan Pembolehubah Keadaan

Nasib baik, semafor boleh dicipta semula menggunakan mutex dan pembolehubah keadaan. Berikut ialah pelaksanaan yang mudah:

#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;
    }
};

Emulasi ini menyediakan gelagat asas semaphore:

  • release() menandakan peristiwa yang mungkin menunggu di semaphore.
  • acquire() menunggu isyarat sebelum meneruskan pelaksanaan.
  • try_acquire() menyemak dan mengambil permit jika ada, tanpa menyekat.

Atas ialah kandungan terperinci Bolehkah Semaphore C 0x Ditiru Menggunakan Mutexes dan Pembolehubah Keadaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn