>  기사  >  백엔드 개발  >  C++ 동시 프로그래밍: 스레드 동기화 및 상호 배제를 수행하는 방법은 무엇입니까?

C++ 동시 프로그래밍: 스레드 동기화 및 상호 배제를 수행하는 방법은 무엇입니까?

王林
王林원래의
2024-05-05 10:00:02860검색

여러 스레드가 동시에 공유 리소스에 액세스하는 경우 스레드 동기화가 중요합니다. C++는 동기화를 달성하기 위해 뮤텍스, 조건 변수 및 원자 연산을 제공합니다. 뮤텍스는 한 번에 하나의 스레드만 리소스에 액세스할 수 있도록 하고, 조건 변수는 스레드 간 통신에 사용되며 단일 작업이 중단되지 않도록 합니다. 예를 들어 뮤텍스를 사용하여 공유 큐에 대한 액세스를 동기화하면 데이터 손상을 방지할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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