Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Penyegerakan Benang Boleh Dicapai dalam C 0x Tanpa Menggunakan Semaphore?

Bagaimanakah Penyegerakan Benang Boleh Dicapai dalam C 0x Tanpa Menggunakan Semaphore?

DDD
DDDasal
2024-12-19 08:26:17998semak imbas

How Can Thread Synchronization Be Achieved in C  0x Without Using Semaphores?

C 0x Tanpa Semaphore: Mencapai Penyegerakan Benang

C 0x memperkenalkan pelbagai peningkatan, tetapi satu peninggalan yang ketara ialah kemasukan semafor. Semaphore adalah penting untuk penyegerakan utas, membolehkan utas menandakan peristiwa dan menunggu penyelesaiannya.

Pernyataan Masalah

Jika tiada semafor, bagaimana kita boleh melaksanakan mekanisme untuk penyegerakan benang seperti yang ditunjukkan dalam semafor POSIX berikut penggunaan:

void thread0(...)
{
  doSomething0();

  event1.wait();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.post();

  ...
}

Penyelesaian Menggunakan Mutex dan Pembolehubah Keadaan

Satu kaedah yang berkesan ialah mencipta kefungsian seperti semaphore menggunakan mutex dan pembolehubah keadaan. Berikut ialah kodnya:

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

Penggunaan

Semafor tersuai ini boleh digunakan dengan cara berikut:

semaphore event1;

void thread0(...)
{
  doSomething0();

  event1.acquire();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.release();

  ...
}

Berbanding kepada Mutex Sahaja

Pendekatan ini menawarkan beberapa kelebihan berbanding menggunakan mutex sahaja:

  • Ia menghapuskan kekaburan untuk memperoleh dan melepaskan muteks yang sama dalam benang yang berbeza, yang boleh membawa kepada kebuntuan.
  • Ia memastikan bahawa benang1 tidak memperoleh muteks sebelum benang0.
  • Ia menyediakan kaedah try_acquire() tambahan untuk pemerolehan tanpa sekatan percubaan.

Dengan menggunakan pelaksanaan semaphore tersuai ini, anda boleh mencapai penyegerakan thread dengan berkesan dalam C 0x tanpa sokongan semaphore yang jelas.

Atas ialah kandungan terperinci Bagaimanakah Penyegerakan Benang Boleh Dicapai dalam C 0x Tanpa Menggunakan Semaphore?. 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