Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Corak reka bentuk biasa dalam pengaturcaraan serentak C++

Corak reka bentuk biasa dalam pengaturcaraan serentak C++

WBOY
WBOYasal
2024-06-02 14:42:56415semak imbas

Dalam pengaturcaraan serentak C++, mengamalkan corak reka bentuk boleh meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan kod Corak biasa termasuk: corak pengeluar-pengguna: satu utas menjana data dan urutan lain menggunakan data. Mod pembaca-penulis: Berbilang pembaca boleh mengakses sumber yang dikongsi pada masa yang sama, tetapi hanya seorang penulis boleh mengaksesnya. Mod monitor: melindungi akses serentak kepada sumber yang dikongsi, menguatkuasakan penyegerakan dan semakan status. Mod kumpulan benang: Buat kumpulan benang terlebih dahulu untuk mengelakkan overhed kerap mencipta dan memusnahkan benang.

C++ 并发编程中的常见设计模式

Corak reka bentuk biasa dalam pengaturcaraan serentak C++

Dalam pengaturcaraan serentak, menggunakan corak reka bentuk boleh meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan kod dengan ketara. Di bawah disenaraikan beberapa corak biasa dalam pengaturcaraan serentak C++:

Corak Pengeluar-Pengguna

Dalam corak ini, satu urutan pengeluar menjana data dan satu atau lebih rangkaian pengguna menggunakan data. Kaedah pelaksanaan biasa menggunakan baris gilir atau memori dikongsi.

Contoh:

class Producer {
public:
    void produce(const T& data) {
        std::lock_guard<std::mutex> lock(queue_mutex);
        queue.push(data);
    }
private:
    std::queue<T> queue;
    std::mutex queue_mutex;
};

class Consumer {
public:
    void consume() {
        std::unique_lock<std::mutex> lock(queue_mutex);
        if (queue.empty()) {
            condition_variable.wait(lock);
        }
        const T& data = queue.front();
        queue.pop();
        lock.unlock();
        // ...
    }
private:
    std::shared_ptr<Producer> producer;
    std::condition_variable condition_variable;
    std::mutex queue_mutex;
};

Mod Pembaca-Penulis

Mod ini membenarkan berbilang pembaca mengakses sumber dikongsi pada masa yang sama, tetapi hanya seorang penulis boleh mengaksesnya. Kunci reentrant atau kunci baca-tulis sering digunakan untuk melaksanakan corak ini.

Contoh:

class ReadWriteLock {
public:
    void read_lock() {
        while (write_locked) {
            unique_lock<std::mutex> lock(read_mutex);
            read_count++;
        }
    }

    void read_unlock() {
        std::lock_guard<std::mutex> lock(read_mutex);
        read_count--;
    }

    void write_lock() {
        std::lock_guard<std::mutex> lock(write_mutex);
        while (read_count > 0) { /* 等待读完成 */}
        write_locked = true;
    }

    void write_unlock() {
        std::lock_guard<std::mutex> lock(write_mutex);
        write_locked = false;
    }

private:
    bool write_locked = false;
    int read_count = 0;
    std::mutex read_mutex;
    std::mutex write_mutex;
};

Pola Pantau

Corak monitor melindungi akses serentak kepada sumber dikongsi dengan mengehadkan akses data kepada satu objek. Pantau objek merangkum data dan operasi serta menguatkuasakan penyegerakan dan semakan status.

Contoh:

class Account {
public:
    void deposit(int amount) {
        std::lock_guard<std::mutex> lock(balance_mutex);
        balance += amount;
    }

    int withdraw(int amount) {
        std::lock_guard<std::mutex> lock(balance_mutex);
        if (amount <= balance) {
            balance -= amount;
            return amount;
        }
        return 0;
    }

    int get_balance() {
        std::lock_guard<std::mutex> lock(balance_mutex);
        return balance;
    }

private:
    int balance = 0;
    std::mutex balance_mutex;
};

Mod Kolam Benang

Mod Kolam Benang menyediakan kumpulan benang pra-dicipta untuk digunakan oleh urutan pelanggan. Dengan menggunakan kumpulan benang, anda boleh mengelakkan overhed untuk kerap mencipta dan memusnahkan benang.

Contoh:

class ThreadPool {
public:
    ThreadPool(int num_threads) {
        for (int i = 0; i < num_threads; i++) {
            threads.emplace_back(std::thread([this] {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(tasks_mutex);
                        if (tasks.empty()) {
                            condition_variable.wait(lock);
                        }
                        task = std::move(tasks.front());
                        tasks.pop();
                    }
                    task();
                }
            }));
        }
    }

    void submit(std::function<void()> task) {
        std::lock_guard<std::mutex> lock(tasks_mutex);
        tasks.push(std::move(task));
        condition_variable.notify_one();
    }

private:
    std::vector<std::jthread> threads;
    std::queue<std::function<void()>> tasks;
    std::mutex tasks_mutex;
    std::condition_variable condition_variable;
};

Atas ialah kandungan terperinci Corak reka bentuk biasa dalam pengaturcaraan serentak C++. 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