> 백엔드 개발 > C++ > 본문

C++ 클래스 디자인에서 동시성 제어를 처리하는 방법은 무엇입니까?

WBOY
풀어 주다: 2024-06-02 21:20:01
원래의
316명이 탐색했습니다.

C++의 동시성 제어는 뮤텍스(중요 섹션에 대한 한 번의 액세스), 조건 변수(조건이 충족될 때까지 대기), 읽기-쓰기 잠금(여러 판독기가 동시에 읽을 수 있지만 하나만 쓸 수 있음)과 같은 메커니즘을 사용합니다. 공유 리소스를 해결하기 위해 동시 액세스로 인해 발생하는 데이터 경합 및 불일치 상태를 해결합니다.

C++ 클래스 디자인에서 동시성 제어를 처리하는 방법은 무엇입니까?

C++ 클래스 디자인의 동시성 제어

소개

멀티 스레드 환경에서 공유 리소스에 대한 동시 액세스는 데이터 경합 및 불일치 상태로 이어질 수 있습니다. 이 문제를 해결하기 위해 C++에서는 동시성 제어를 처리하는 다양한 메커니즘을 제공합니다.

Mutex

뮤텍스는 한 번에 하나의 스레드만 중요한 섹션에 액세스할 수 있도록 허용하는 동기화 기본 요소입니다. std::mutex 클래스를 사용하여 뮤텍스를 만들 수 있습니다. std::mutex 类来创建一个互斥量:

std::mutex mutex;
로그인 후 복사

要访问临界区,线程必须获取互斥量的锁:

mutex.lock();
// 访问临界区
mutex.unlock();
로그인 후 복사

条件变量

条件变量是一个同步原语,它允许一个线程等待另一个线程完成特定的条件。我们可以使用 std::condition_variable 类来创建一个条件变量:

std::condition_variable cv;
로그인 후 복사

线程可以通过调用 wait() 方法来等待条件:

cv.wait(mutex);
로그인 후 복사

当条件满足时,另一個執行緒可以呼叫 notify_one()notify_all() 方法來通知等待的執行緒:

cv.notify_one();
cv.notify_all();
로그인 후 복사

读写锁

读写锁是一种同步原语,它允许多个线程同时读取共享资源,但一次只有一个线程可以写入共享资源。我们可以使用 std::shared_mutex

std::shared_mutex rw_mutex;
로그인 후 복사

중요 섹션에 액세스하려면 스레드가 뮤텍스 잠금을 획득해야 합니다.

rw_mutex.lock_shared();
// 读取共享资源
rw_mutex.unlock_shared();
로그인 후 복사

조건 변수

조건 변수 한 스레드가 다른 스레드가 특정 조건을 완료할 때까지 기다릴 수 있도록 하는 동기화 기본 요소입니다. std::condition_variable 클래스를 사용하여 조건 변수를 생성할 수 있습니다.

rw_mutex.lock();
// 写入共享资源
rw_mutex.unlock();
로그인 후 복사

스레드는 wait() 메서드를 호출하여 조건을 기다릴 수 있습니다.

class BankAccount {
public:
    BankAccount(int initial_balance) : balance(initial_balance) {}
    
    void deposit(int amount) {
        balance += amount;
    }
    
    void withdraw(int amount) {
        if (amount <= balance) {
            balance -= amount;
        }
    }
    
private:
    int balance;
};
로그인 후 복사

When 조건이 충족되면 다른 스레드가 notify_one() 또는 notify_all() 메서드를 호출하여 대기 스레드에 알릴 수 있습니다.

class BankAccount {
public:
    BankAccount(int initial_balance) : balance(initial_balance) {}
    
    void deposit(int amount) {
        std::lock_guard<std::mutex> lock(mutex);
        balance += amount;
    }
    
    void withdraw(int amount) {
        std::lock_guard<std::mutex> lock(mutex);
        if (amount <= balance) {
            balance -= amount;
        }
    }
    
private:
    std::mutex mutex;
    int balance;
};
로그인 후 복사
read-write lock

read-write 잠금은 여러 스레드가 공유 리소스에서 동시에 읽을 수 있도록 허용하지만 한 번에 하나의 스레드만 공유 리소스에 쓸 수 있는 동기화 기본 요소입니다. std::shared_mutex 클래스를 사용하여 읽기-쓰기 잠금을 생성할 수 있습니다. 🎜rrreee🎜공유 리소스를 읽으려면 스레드가 읽기 잠금을 획득할 수 있습니다. 🎜rrreee🎜공유 리소스에 쓰기 위해 스레드는 쓰기를 획득할 수 있습니다. 잠금 :🎜rrreee🎜실용 사례🎜🎜잔액 멤버 변수와 입출금 방법을 포함하는 간단한 은행 계좌 클래스를 생각해 보세요.🎜rrreee🎜동시 액세스를 처리하기 위해 뮤텍스를 사용하여 잔액 멤버 변수를 보호할 수 있습니다. 🎜 rrreee🎜 이제 여러 스레드에서 동시에 안전하게 은행 계좌에 액세스할 수 있습니다. 🎜

위 내용은 C++ 클래스 디자인에서 동시성 제어를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿