>백엔드 개발 >C++ >C++ 클래스 디자인에서 스레드 안전성을 구현하는 방법은 무엇입니까?

C++ 클래스 디자인에서 스레드 안전성을 구현하는 방법은 무엇입니까?

WBOY
WBOY원래의
2024-06-03 18:48:091040검색

스레드 안전성을 달성하기 위해 C++에는 두 가지 방법이 있습니다. 뮤텍스를 사용하여 중요한 섹션을 보호하고 한 번에 하나의 스레드만 액세스하도록 허용합니다. 원자성 작업을 사용하면 작업이 분할할 수 없는 방식으로 수행되므로 동시 액세스 문제가 제거됩니다.

C++ 클래스 디자인에서 스레드 안전성을 구현하는 방법은 무엇입니까?

C++ 클래스 디자인에서 스레드 안전성 구현

소개

멀티 스레드 환경에서는 데이터의 스레드 안전성을 보장하는 것이 중요합니다. C++에서 이를 달성하는 방법에는 여러 가지가 있습니다. 이 기사에서는 뮤텍스와 원자적 연산을 사용하여 스레드로부터 안전한 클래스를 디자인하는 방법을 살펴보겠습니다.

Mutex

뮤텍스는 한 번에 하나의 스레드만 중요 섹션에 액세스할 수 있도록 허용하는 잠금 메커니즘입니다. 스레드가 임계 섹션에 들어가면 뮤텍스의 소유권을 얻습니다. 임계 구역에 들어가려는 다른 스레드는 해당 스레드가 뮤텍스를 해제할 때까지 차단됩니다.

class ThreadSafeCounter {
private:
    std::mutex m_mutex;
    int m_count;

public:
    void increment() {
        std::lock_guard<std::mutex> lock(m_mutex);
        ++m_count;
    }

    int get() {
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_count;
    }
};

위의 예에서 increment()get() 메서드는 모두 표준 라이브러리의 std::mutex를 사용하여 중요 구역을 보호합니다. 한 스레드가 개수를 업데이트하는 동안 다른 스레드는 동시에 increment() 메서드를 시작할 수 없습니다. increment()get() 方法都使用标准库中的 std::mutex 保护临界区。当一个线程正在更新计数时,其他线程无法同时进入 increment() 方法。

原子操作

原子操作是一种特殊类型的操作,它以不可分割的方式执行。这意味着一次只能在单个线程中执行这些操作,从而消除了并发访问引发的问题。C++11 中引入了 std::atomic 库,它提供了用于原子操作的类。

class ThreadSafeCounterAtomic {
private:
    std::atomic<int> m_count;

public:
    void increment() {
        ++m_count;
    }

    int get() {
        return m_count.load();
    }
};

在本例中,m_count 是一个原子整数,可以安全地从多个线程中进行增量和获取。std::atomic<int>::load()</int>

원자적 연산

원자적 연산은 분할할 수 없는 방식으로 수행되는 특별한 유형의 연산입니다. 즉, 이러한 작업은 한 번에 단일 스레드에서만 수행될 수 있으므로 동시 액세스로 인해 발생하는 문제가 제거됩니다. C++11에는 원자성 연산을 위한 클래스를 제공하는 std::atomic 라이브러리가 도입되었습니다.

#include <thread>

int main() {
    std::unique_ptr<ThreadSafeCounter> counter = std::make_unique<ThreadSafeCounter>();

    std::vector<std::thread> threads(10);
    for (auto& thread : threads) {
        thread = std::thread([&] {
            for (int i = 0; i < 1000000; ++i) {
                counter->increment();
            }
        });
    }

    for (auto& thread : threads) {
        thread.join();
    }

    std::cout << "最终计数:" << counter->get() << std::endl;
}

이 경우 m_count는 안전하게 증가하고 여러 스레드에서 검색할 수 있는 원자 정수입니다. std::atomic<int>::load()</int> 메서드는 스레드로부터 안전한 방식으로 원자 정수 값을 가져옵니다.

실용 사례

여러 스레드에서 병렬로 업데이트해야 하는 공유 카운터의 예를 생각해 보세요.

rrreee

이 프로그램에서는 10개의 스레드에서 카운터를 병렬로 업데이트한 다음 최종 개수를 메인 스레드. 뮤텍스는 카운터가 언제든지 최대 하나의 스레드에 의해서만 업데이트될 수 있도록 보장하므로 스레드 안전성이 보장됩니다. 🎜🎜🎜결론🎜🎜🎜스레드로부터 안전한 C++ 클래스는 뮤텍스 및 원자적 연산을 사용하여 설계할 수 있습니다. 뮤텍스는 직렬 액세스가 필요한 중요 섹션을 보호하는 데 적합한 반면, 원자 작업은 직렬 액세스가 필요하지 않고 원자적으로 수행될 수 있는 작업에 적합합니다. 🎜

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

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