> 백엔드 개발 > C++ > C++ 함수에서 스레드로부터 안전한 데이터 구조를 구현하는 방법은 무엇입니까?

C++ 함수에서 스레드로부터 안전한 데이터 구조를 구현하는 방법은 무엇입니까?

王林
풀어 주다: 2024-04-27 08:33:02
원래의
835명이 탐색했습니다.

C++ 함수에서 스레드로부터 안전한 데이터 구조를 구현하는 방법은 무엇입니까? 중요 섹션(공유 데이터)을 보호하려면 뮤텍스 잠금을 사용하세요. 스레드로부터 안전한 동적 배열 예: 뮤텍스를 사용하여 std::Vector의 데이터를 보호합니다. 실제 사례: 스레드로부터 안전한 큐, 뮤텍스 잠금 및 조건 변수를 사용하여 메시지 큐의 스레드 안전성을 달성합니다.

如何在 C++ 函数中实现线程安全的数据结构?

C++ 함수에서 스레드로부터 안전한 데이터 구조를 구현하는 방법은 무엇입니까?

멀티 스레드 애플리케이션에서 공유 데이터에 대한 동시 액세스는 경합 상태 및 데이터 손상을 초래할 수 있습니다. 따라서 각 스레드가 데이터에 안전하게 액세스하고 수정할 수 있도록 공유 데이터 구조를 스레드로부터 안전하게 만드는 것이 중요합니다.

스레드로부터 안전한 데이터 구조를 구현하는 간단한 방법은 뮤텍스 잠금을 사용하는 것입니다. 뮤텍스는 한 번에 하나의 스레드만 임계 섹션(공유 데이터)에 액세스할 수 있도록 허용하는 동기화 기본 요소입니다. 다음 코드 예제는 뮤텍스를 사용하여 동적 배열의 데이터를 보호하는 방법을 보여줍니다.

#include <mutex>
#include <vector>

std::mutex m;

// 线程安全的动态数组
class ThreadSafeVector {
public:
    void push_back(int value) {
        std::lock_guard<std::mutex> lock(m);
        v.push_back(value);
    }
    
    int get(size_t index) {
        std::lock_guard<std::mutex> lock(m);
        return v[index];
    }

private:
    std::vector<int> v;
};

int main() {
    ThreadSafeVector v;
    v.push_back(1);
    int value = v.get(0);
    // ...
}
로그인 후 복사

이 예제에서 std::lock_guard는 RAII(자원 획득, 즉 초기화) 래퍼로 사용됩니다. 크리티컬 섹션에 진입할 때 사용됩니다. 크리티컬 섹션을 종료할 때 자동으로 뮤텍스 잠금을 획득하고, 크리티컬 섹션을 종료할 때 자동으로 뮤텍스 잠금을 해제합니다. 이렇게 하면 한 번에 하나의 스레드만 v 벡터에 액세스할 수 있습니다. std::lock_guard 用作 RAII(资源获取即初始化)封装,它在进入临界区时自动获取互斥锁,并在退出临界区时自动释放互斥锁。这确保了在同一时间只有一个线程能访问 v 向量。

实战案例:线程安全的队列

假设我们有一个多线程应用程序,线程需要共享一个消息队列。为了使队列线程安全,可以使用互斥锁和条件变量来实现:

#include <mutex>
#include <condition_variable>
#include <queue>

std::mutex m;
std::condition_variable cv;

class ThreadSafeQueue {
public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(m);
        q.push(value);
        cv.notify_one();
    }
    
    int pop() {
        std::unique_lock<std::mutex> lock(m);
        cv.wait(lock, [this]{ return !q.empty(); });
        int value = q.front();
        q.pop();
        return value;
    }

private:
    std::queue<int> q;
};

int main() {
    ThreadSafeQueue q;
    // ...
}
로그인 후 복사

在这种情况下,std::condition_variable 用于通知线程队列中是否有新的消息。std::unique_lock 用于锁定和解锁互斥锁,同时还可以通过 cv.wait()

🎜실용 사례: 스레드로부터 안전한 대기열🎜🎜🎜멀티 스레드 애플리케이션이 있고 스레드가 메시지 대기열을 공유해야 한다고 가정해 보겠습니다. 큐를 스레드로부터 안전하게 만들기 위해 뮤텍스와 조건 변수를 사용하여 이를 달성할 수 있습니다: 🎜rrreee🎜 이 경우 새 메시지가 있는 경우 스레드에 알리는 데 std::condition_variable가 사용됩니다. 대기열에 있습니다. std::unique_lock은 뮤텍스를 잠그거나 잠금 해제하는 데 사용되며 대기열에 새 메시지가 있을 때까지 cv.wait() 메서드를 통해 스레드를 절전 모드로 만들 수도 있습니다. 🎜

위 내용은 C++ 함수에서 스레드로부터 안전한 데이터 구조를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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