스레드 안전성을 달성하기 위해 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()
원자적 연산
원자적 연산은 분할할 수 없는 방식으로 수행되는 특별한 유형의 연산입니다. 즉, 이러한 작업은 한 번에 단일 스레드에서만 수행될 수 있으므로 동시 액세스로 인해 발생하는 문제가 제거됩니다. 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()
메서드는 스레드로부터 안전한 방식으로 원자 정수 값을 가져옵니다.
실용 사례
여러 스레드에서 병렬로 업데이트해야 하는 공유 카운터의 예를 생각해 보세요.rrreee
이 프로그램에서는 10개의 스레드에서 카운터를 병렬로 업데이트한 다음 최종 개수를 메인 스레드. 뮤텍스는 카운터가 언제든지 최대 하나의 스레드에 의해서만 업데이트될 수 있도록 보장하므로 스레드 안전성이 보장됩니다. 🎜🎜🎜결론🎜🎜🎜스레드로부터 안전한 C++ 클래스는 뮤텍스 및 원자적 연산을 사용하여 설계할 수 있습니다. 뮤텍스는 직렬 액세스가 필요한 중요 섹션을 보호하는 데 적합한 반면, 원자 작업은 직렬 액세스가 필요하지 않고 원자적으로 수행될 수 있는 작업에 적합합니다. 🎜위 내용은 C++ 클래스 디자인에서 스레드 안전성을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!