Rumah > pembangunan bahagian belakang > C++ > Adakah C 0x Kekurangan Semaphore, dan Apakah Alternatif untuk Penyegerakan Benang?

Adakah C 0x Kekurangan Semaphore, dan Apakah Alternatif untuk Penyegerakan Benang?

Patricia Arquette
Lepaskan: 2024-12-24 08:24:19
asal
889 orang telah melayarinya

Does C  0x Lack Semaphores, and What Are the Alternatives for Thread Synchronization?

Adakah C 0x Hilang Semaphore? Penyelesaian untuk Penyegerakan Benang

Dalam bidang pengaturcaraan berbilang benang, mekanisme penyegerakan adalah penting untuk menyelaraskan akses kepada sumber yang dikongsi dan memastikan integriti pelaksanaan program. Semaphore telah menjadi alat biasa untuk tujuan ini, membenarkan benang menunggu atau memberi isyarat antara satu sama lain berdasarkan keadaan tertentu.

Walau bagaimanapun, dengan kemunculan C 0x, telah dibuat spekulasi bahawa semaphore mungkin menjadi usang. Adakah ini benar, dan jika ya, apakah alternatif yang tersedia untuk penyegerakan benang dalam C 0x?

Menyahmistikan Mitos Semaphore C 0x

C 0x tidak menyediakan semaphore secara jelas sebagai ciri teras. Sebaliknya, ia memperkenalkan penyelesaian yang lebih serba boleh dan cekap: pembolehubah keadaan berpasangan dengan mutex. Gabungan ini membolehkan pembangun melaksanakan primitif penyegerakan tersuai yang memenuhi keperluan khusus mereka sepenuhnya.

Melaksanakan Semaphore Mudah dengan Pembolehubah Keadaan

Untuk menggambarkan bagaimana pembolehubah keadaan boleh digunakan untuk meniru semafor, pertimbangkan perkara berikut coretan kod:

#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;
    }
};
Salin selepas log masuk

Kelas ini berfungsi sebagai pelaksanaan yang ringan daripada semafor. Kaedah release() membuka kunci semafor, menandakan bahawa sumber telah tersedia. Kaedah acquire() menunggu sehingga sumber tersedia dan kemudian mengunci semaphore. Kaedah try_acquire() cuba mengunci semaphore tanpa menunggu, mengembalikan boolean yang menunjukkan kejayaan atau kegagalan.

Penyelesaian ini memanfaatkan pembolehubah keadaan untuk mengendalikan mekanisme menunggu dan isyarat, menyediakan pendekatan yang fleksibel dan boleh diperluaskan kepada fungsi semaphore.

Atas ialah kandungan terperinci Adakah C 0x Kekurangan Semaphore, dan Apakah Alternatif untuk Penyegerakan Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan