다중 스레드 환경에서 스레드가 공유 리소스에 순차적으로 액세스할 수 있도록 C++에서는 다음 스레드 동기화 메커니즘을 제공합니다. 뮤텍스(Mutex): 동시에 하나의 스레드만 액세스할 수 있도록 중요 섹션에 대한 상호 배타적 액세스를 제공합니다. . 조건 변수(Condition Variable): 특정 조건이 충족될 때까지 기다린 후 실행을 계속하기 위해 뮤텍스 잠금과 함께 사용됩니다. 리더-라이터 잠금: 여러 스레드가 동시에 공유 리소스를 읽을 수 있도록 허용하지만 쓰기는 단일 스레드만 허용합니다. 세마포어(Semaphore): 제한된 자원에 대한 접근을 제어하고, 자원이 사용 가능해질 때까지 기다렸다가 해제하는 기능을 제공합니다. 실제 사례에서는 뮤텍스 잠금을 사용하여 스레드로부터 안전한 대기열에 대한 액세스를 보호하고 푸시 및 팝 작업의 스레드 안전성을 보장할 수 있습니다.
C++ 스레드 동기화 메커니즘의 비교 및 대조
멀티 스레드 환경에서 스레드 동기화 메커니즘은 스레드 간 공유 리소스에 대한 질서 있는 액세스를 보장하고 데이터 경쟁과 교착 상태를 방지하는 데 중요합니다. C++ 언어는 스레드를 동기화하기 위한 여러 가지 메커니즘을 제공하며, 각 메커니즘에는 고유한 장점과 단점이 있습니다. 이 기사에서는 C++에서 가장 일반적으로 사용되는 스레드 동기화 메커니즘을 비교 및 대조하고 실제 예제를 제공합니다.
Mutex(Mutex)
Mutex는 가장 기본적인 스레드 동기화 메커니즘으로 임계 섹션에 대한 액세스를 통해 언제든지 하나의 스레드만 임계 섹션에 액세스할 수 있도록 보장합니다. 뮤텍스 잠금은 std::mutex
클래스를 통해 생성할 수 있습니다. std::mutex
类创建。
// 创建互斥锁 std::mutex m; // 加锁 m.lock(); // 访问临界区 // ... // 解锁 m.unlock();
条件变量(Condition Variable)
条件变量用于等待特定条件满足后才继续执行。它通常与互斥锁配合使用,以保证条件检查和状态更新的原子性。
// 创建条件变量 std::condition_variable cv; // 获取锁 std::mutex m; m.lock(); // 等待条件满足 while (!condition) { cv.wait(m); } // 更新状态 // ... // 解锁 m.unlock();
读写锁(Reader-Writer Lock)
读写锁允许多个线程同时读取共享资源,但只有单个线程可以写入共享资源。这提高了读取操作的性能,同时保证了写入操作的排他性。C++ 中可以使用 std::shared_mutex
类创建读写锁。
// 创建读写锁 std::shared_mutex rw; // 获取读锁 rw.lock_shared(); // 读取共享资源 // ... // 解锁读锁 rw.unlock_shared(); // 获取写锁 rw.lock(); // 写入共享资源 // ... // 解锁写锁 rw.unlock();
信号量(Semaphore)
信号量是一个同步原语,用于控制对有限资源的访问。它提供了等待资源可用并释放资源的功能。
// 创建信号量,初始值为 3 std::counting_semaphore<3> sem(3); // 等待资源可用 sem.acquire(); // 使用资源 // ... // 释放资源 sem.release();
实战案例
线程安全队列
假设我们有一个用于管理任务的线程安全队列。队列的 push
和 pop
// 线程安全队列类 struct Queue { std::mutex m; std::queue<int> q; void push(int value) { std::lock_guard<std::mutex> lock(m); // 自动获取和释放锁 q.push(value); } int pop() { std::lock_guard<std::mutex> lock(m); if (q.empty()) { throw std::runtime_error("队列为空"); } int value = q.front(); q.pop(); return value; } };
조건 변수
조건 변수는 실행을 계속하기 전에 특정 조건이 충족될 때까지 기다리는 데 사용됩니다. 조건 확인 및 상태 업데이트의 원자성을 보장하기 위해 종종 뮤텍스 잠금과 함께 사용됩니다. 🎜rrreee🎜🎜Reader-Writer Lock🎜🎜🎜Read-Writer Lock을 사용하면 여러 스레드가 동시에 공유 리소스를 읽을 수 있지만 단일 스레드만 공유 리소스에 쓸 수 있습니다. 이는 쓰기 작업의 독점성을 보장하면서 읽기 작업의 성능을 향상시킵니다. C++에서는std::shared_mutex
클래스를 사용하여 읽기-쓰기 잠금을 생성할 수 있습니다. 🎜rrreee🎜🎜Semaphore🎜🎜🎜Semaphore는 제한된 리소스에 대한 액세스를 제어하는 데 사용되는 동기화 프리미티브입니다. 리소스가 사용 가능해질 때까지 기다렸다가 해제하는 기능을 제공합니다. 🎜rrreee🎜🎜실용 사례🎜🎜🎜🎜Thread-safe 대기열🎜🎜🎜작업 관리를 위한 스레드로부터 안전한 대기열이 있다고 가정해 보겠습니다. 큐의 push
및 pop
작업은 데이터 경합을 방지하기 위해 스레드로부터 안전해야 합니다. 🎜🎜아래와 같이 뮤텍스를 사용하여 대기열에 대한 액세스를 보호할 수 있습니다. 🎜rrreee🎜뮤텍스를 사용하면 언제든지 하나의 스레드만 대기열에 액세스할 수 있으므로 스레드 안전성이 보장됩니다. 🎜위 내용은 서버 아키텍처의 C++ 스레드 동기화 메커니즘 비교 및 대조의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!