>백엔드 개발 >C++ >C++ 동시 프로그래밍: 동시성을 달성하기 위해 멀티 코어 CPU를 사용하는 방법은 무엇입니까?

C++ 동시 프로그래밍: 동시성을 달성하기 위해 멀티 코어 CPU를 사용하는 방법은 무엇입니까?

PHPz
PHPz원래의
2024-05-01 11:51:01322검색

C++ 동시 프로그래밍은 스레드, 뮤텍스 및 조건 변수를 생성하여 멀티 코어 CPU를 최대한 활용합니다. 스레드를 생성하면 작업을 병렬로 실행할 수 있습니다. 뮤텍스는 여러 스레드가 동시에 공유 데이터에 액세스하지 않도록 잠금 역할을 하여 데이터 손상을 방지합니다. 조건 변수는 특정 조건이 충족되었음을 스레드에 알리는 데 사용되며 조건이 충족될 때까지 스레드가 계속 실행되는 것을 방지하기 위해 뮤텍스 잠금과 함께 사용됩니다.

C++ 동시 프로그래밍: 동시성을 달성하기 위해 멀티 코어 CPU를 사용하는 방법은 무엇입니까?

C++의 동시 프로그래밍: 멀티 코어 CPU 잠금 해제

머리말

최신 CPU에는 종종 다중 코어가 있으며 이러한 코어를 최대한 활용하면 작업을 병렬로 실행할 때 코드 효율성을 크게 향상시킬 수 있습니다. C++는 프로그래머가 여러 작업을 동시에 수행할 수 있는 응용 프로그램을 쉽게 만들 수 있도록 다양한 동시 프로그래밍 도구를 제공합니다.

스레드 생성

스레드 생성은 동시성을 나타내는 기본 구성 요소입니다. C++에서는 std::thread 클래스를 사용하여 새 스레드를 생성할 수 있습니다. 별도의 스레드에서 수행할 작업을 지정하는 호출 가능 객체를 인수로 받아들입니다. std::thread 类创建新线程。它接受一个可调用对象作为参数,该对象指定在单独的线程中执行的任务。

#include <iostream>
#include <thread>

void hello_world() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  std::thread thread1(hello_world);
  thread1.join();

  return 0;
}

在上面的代码中,hello_world() 函数是一个可调用对象,它只需向控制台打印一条消息。std::thread 构造函数创建一个新线程并执行可调用对象。thread1.join() 阻塞主线程,直到新线程完成。

互斥锁

线程并发访问共享数据时,互斥锁非常重要。它们充当锁,防止多个线程同时访问关键部分,从而避免数据损坏。在 C++ 中,可以使用 std::mutex 类创建互斥锁。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;  // 全局互斥锁

void increment(int& counter) {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ++counter;
}

int main() {
  int counter = 0;

  std::thread thread1(increment, std::ref(counter));
  std::thread thread2(increment, std::ref(counter));

  thread1.join();
  thread2.join();

  std::cout << "Final counter value: " << counter << std::endl;

  return 0;
}

在这个示例中,increment() 函数对共享变量 counter 进行递增。我们使用 std::lock_guard 来获取互斥锁,确保只有一个线程可以同时执行关键部分。这种机制确保两个线程不会同时递增 counter,从而避免数据竞争。

条件变量

条件变量用于通知线程特定条件已满足。它们与互斥锁一起使用,以确保线程在满足条件之前不会继续执行。在 C++ 中,可以使用 std::condition_variable 类创建条件变量。

#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>

std::mutex m;  // 全局互斥锁
std::condition_variable cv;  // 全局条件变量
bool ready = false;  // 共享布尔标志

void producer() {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ready = true;                       // 设置共享标志为 true
  cv.notify_one();                   // 通知一个等待的线程
}

void consumer() {
  std::unique_lock<std::mutex> lock(m);  // 获取互斥锁(并锁定它)
  while (!ready)                        // 等待共享标志为 true
    cv.wait(lock);                     // 释放互斥锁并等待
}

int main() {
  std::thread producer_thread(producer);
  std::thread consumer_thread(consumer);

  producer_thread.join();
  consumer_thread.join();

  return 0;
}

在此示例中,我们使用条件变量来协调生产者和消费者线程之间的交互。producer() 函数设置共享标志 ready 为 true 并通知消费者线程。consumer()rrreee

위 코드에서 hello_world() 함수는 단순히 콘솔에 메시지를 인쇄하는 호출 가능한 개체입니다. std::thread 생성자는 새 스레드를 생성하고 호출 가능 개체를 실행합니다. thread1.join()은 새 스레드가 완료될 때까지 기본 스레드를 차단합니다. 🎜🎜🎜Mutex 잠금🎜🎜🎜Mutex 잠금은 스레드가 공유 데이터에 동시에 액세스할 때 매우 중요합니다. 이는 여러 스레드가 중요한 섹션에 동시에 액세스하는 것을 방지하는 잠금 역할을 하여 데이터 손상을 방지합니다. C++에서는 std::mutex 클래스를 사용하여 뮤텍스 잠금을 만들 수 있습니다. 🎜rrreee🎜이 예에서 increment() 함수는 공유 변수 counter를 증가시킵니다. 우리는 std::lock_guard를 사용하여 뮤텍스 잠금을 획득하여 동시에 하나의 스레드만 임계 섹션을 실행할 수 있도록 보장합니다. 이 메커니즘은 두 스레드가 동시에 counter를 증가시키지 않도록 하여 데이터 경합을 방지합니다. 🎜🎜🎜조건 변수🎜🎜🎜조건 변수는 특정 조건이 충족되었음을 스레드에 알리는 데 사용됩니다. 조건이 충족될 때까지 스레드가 계속 실행되지 않도록 하기 위해 뮤텍스 잠금과 함께 사용됩니다. C++에서는 std::condition_variable 클래스를 사용하여 조건 변수를 생성할 수 있습니다. 🎜rrreee🎜이 예에서는 조건 변수를 사용하여 생산자 스레드와 소비자 스레드 간의 상호 작용을 조정합니다. producer() 함수는 공유 플래그 ready를 true로 설정하고 소비자 스레드에 알립니다. consumer() 함수는 실행을 계속하기 전에 조건 변수를 기다려 공유 플래그가 true가 될 때까지 기다립니다. 🎜

위 내용은 C++ 동시 프로그래밍: 동시성을 달성하기 위해 멀티 코어 CPU를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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