>  기사  >  백엔드 개발  >  C++ 동시 프로그래밍의 일반적인 디자인 패턴

C++ 동시 프로그래밍의 일반적인 디자인 패턴

WBOY
WBOY원래의
2024-06-02 14:42:56418검색

C++ 동시 프로그래밍에서 디자인 패턴을 채택하면 코드의 가독성, 유지 관리성 및 확장성이 향상될 수 있습니다. 일반적인 패턴은 다음과 같습니다. 생산자-소비자 패턴: 한 스레드는 데이터를 생성하고 다른 스레드는 데이터를 소비합니다. 리더-라이터 모드: 여러 리더가 동시에 공유 리소스에 액세스할 수 있지만 작성자는 한 명만 액세스할 수 있습니다. 모니터 모드: 공유 리소스에 대한 동시 액세스를 보호하고 동기화 및 상태 확인을 시행합니다. 스레드 풀 모드: 스레드 그룹을 미리 생성하여 스레드를 자주 생성하고 삭제하는 오버헤드를 방지합니다.

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

C++ 동시 프로그래밍의 일반적인 디자인 패턴

동시 프로그래밍에서 디자인 패턴을 사용하면 코드의 가독성, 유지 관리성 및 확장성을 크게 향상시킬 수 있습니다. 아래에는 C++ 동시 프로그래밍의 몇 가지 일반적인 패턴이 나열되어 있습니다.

생산자-소비자 패턴

이 패턴에서는 하나의 생산자 스레드가 데이터를 생성하고 하나 이상의 소비자 스레드가 데이터를 소비합니다. 일반적인 구현 방법은 대기열이나 공유 메모리를 사용하는 것입니다.

예:

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

Reader-Writer 모드

이 모드를 사용하면 여러 독자가 동시에 공유 리소스에 액세스할 수 있지만 작성자는 한 명만 액세스할 수 있습니다. 재진입 잠금 또는 읽기-쓰기 잠금은 이 패턴을 구현하는 데 자주 사용됩니다.

예:

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

모니터 패턴

모니터 패턴은 단일 개체에 대한 데이터 액세스를 제한하여 공유 리소스에 대한 동시 액세스를 보호합니다. 모니터 개체는 데이터와 작업을 캡슐화하고 동기화 및 상태 확인을 시행합니다.

예:

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

스레드 풀 모드

스레드 풀 모드는 클라이언트 스레드에서 사용할 사전 생성된 스레드 그룹을 제공합니다. 스레드 풀을 사용하면 스레드를 자주 생성하고 삭제하는 오버헤드를 피할 수 있습니다.

예:

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

위 내용은 C++ 동시 프로그래밍의 일반적인 디자인 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.