여러 스레드가 동시에 공유 리소스에 액세스하는 경우 스레드 동기화가 중요합니다. C++는 동기화를 달성하기 위해 뮤텍스, 조건 변수 및 원자 연산을 제공합니다. 뮤텍스는 한 번에 하나의 스레드만 리소스에 액세스할 수 있도록 하고, 조건 변수는 스레드 간 통신에 사용되며 단일 작업이 중단되지 않도록 합니다. 예를 들어 뮤텍스를 사용하여 공유 큐에 대한 액세스를 동기화하면 데이터 손상을 방지할 수 있습니다.
C++ 동시 프로그래밍: 스레드 동기화 및 상호 배제
개요
스레드 동기화는 여러 스레드가 동시에 공유 리소스에 액세스할 때 데이터 무결성이 유지되도록 보장하는 열쇠입니다. C++는 뮤텍스, 조건 변수, 원자적 연산을 포함하여 스레드 동기화를 달성하기 위한 다양한 메커니즘을 제공합니다.
Mutex(Mutex)
뮤텍스는 한 번에 하나의 스레드만 공유 리소스에 액세스할 수 있도록 허용하는 개체입니다. 뮤텍스는 다음과 같이 사용됩니다.
std::mutex m; void func() { std::lock_guard<std::mutex> lock(m); // 获取互斥体锁 // 访问共享资源 // ... }
std::lock_guard
는 뮤텍스에 대한 잠금을 나타내는 RAII 유형입니다. func()
함수 실행이 완료되면 잠금이 자동으로 해제됩니다. std::lock_guard
是一种 RAII 类型,表示对互斥体的锁定。当func()
函数执行完时,锁将自动释放。
条件变量 (Condition Variable)
条件变量用于线程之间的通信。它允许一个线程等待,直到另一个线程满足某些条件。使用方法如下:
std::condition_variable cv; void wait() { std::unique_lock<std::mutex> lock(m); cv.wait(lock); // 等待条件变量 } void notify() { std::unique_lock<std::mutex> lock(m); cv.notify_one(); // 通知等待的线程 }
std::unique_lock
表示对互斥体的独占锁定。当wait()
函数被调用时,线程将被阻塞,直到notify_one()
조건 변수
조건 변수는 스레드 간의 통신에 사용됩니다. 한 스레드가 다른 스레드가 특정 조건을 충족할 때까지 기다릴 수 있습니다. 사용법은 다음과 같습니다.std::atomic<int> counter; void increment() { counter++; // 原子地递增计数器 }
std::unique_lock
는 뮤텍스에 대한 배타적 잠금을 나타냅니다. wait()
함수가 호출되면 notify_one()
함수가 호출될 때까지 스레드가 차단됩니다. 원자적 연산
원자적 연산은 단일 작업이 중단 없이 실행될 수 있도록 보장하는 하위 수준 동기화 메커니즘입니다. 사용법은 다음과 같습니다. 🎜std::mutex m; std::queue<int> queue; const int MAX_SIZE = 10; // 队列最大容量 void producer() { while (true) { std::lock_guard<std::mutex> lock(m); if (queue.size() < MAX_SIZE) { queue.push(rand()); } } } void consumer() { while (true) { std::lock_guard<std::mutex> lock(m); if (!queue.empty()) { std::cout << queue.front() << std::endl; queue.pop(); } } }🎜🎜실용 사례🎜🎜🎜여러 스레드가 공유 대기열에 액세스하고 대기열 크기가 상한인 시나리오를 고려해보세요. 스레드가 동시에 큐에 액세스하여 데이터 손상을 일으키는 것을 방지하기 위해 뮤텍스를 사용하여 큐에 대한 액세스를 동기화할 수 있습니다. 🎜rrreee
위 내용은 C++ 동시 프로그래밍: 스레드 동기화 및 상호 배제를 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!