>  기사  >  백엔드 개발  >  C++에서 스레드를 생성하고 관리하는 방법은 무엇입니까? 어떤 스레드 동기화 메커니즘이 있습니까?

C++에서 스레드를 생성하고 관리하는 방법은 무엇입니까? 어떤 스레드 동기화 메커니즘이 있습니까?

王林
王林원래의
2024-05-07 21:03:01511검색

C++의 스레드 스레드는 동시 프로그래밍을 가능하게 하는 경량 실행 단위입니다. std::thread 클래스를 사용하여 스레드를 생성하고 뮤텍스 잠금, 조건 변수 및 스핀 잠금과 같은 동기화 메커니즘을 통해 공유 데이터의 일관성을 유지합니다. 실제 사례에서는 스레드를 사용하여 동시에 합계를 계산하는 프로세스를 보여줍니다.

C++ 中如何创建和管理线程?有哪些线程同步机制?

C++의 스레드 생성 및 관리

스레드는 프로세스와 동일한 주소 공간을 공유하여 동시 프로그래밍을 가능하게 하는 경량 실행 단위입니다.

스레드 만들기

C++에서는 std::thread 클래스를 사용하여 스레드를 만듭니다.

#include <thread>

void thread_function() {
  // 执行线程任务
}

int main() {
  std::thread thread(thread_function);
  thread.join();  // 阻塞主线程,直到线程执行完毕
  return 0;
}

스레드 동기화 메커니즘

스레드 간 공유 데이터의 일관성을 유지하려면 동기화 메커니즘을 사용해야 합니다.

Mutex(Mutex )

#include <mutex>

std::mutex mutex;

void thread_function() {
  std::lock_guard<std::mutex> lock(mutex);
  // 对共享数据进行操作
}

조건변수

#include <condition_variable>

std::condition_variable cv;
std::mutex cv_mutex;

void thread_function() {
  std::unique_lock<std::mutex> lock(cv_mutex);
  cv.wait(lock, [] { return condition_is_met; });
  // 条件满足时,继续执行
}

Spinlock

#include <atomic>

std::atomic_flag spinlock = ATOMIC_FLAG_INIT;

void thread_function() {
  while (spinlock.test_and_set(std::memory_order_acquire));
  // 对共享数据进行操作
  spinlock.clear(std::memory_order_release);
}

실제 사례

동시 계산 및 합산

#include <thread>
#include <vector>

std::mutex sum_mutex;
long long sum = 0;

void add_numbers(const std::vector<int>& numbers) {
  for (int num : numbers) {
    std::lock_guard<std::mutex> lock(sum_mutex);
    sum += num;
  }
}

int main() {
  std::vector<std::thread> threads;
  std::vector<int> numbers = {...};  // 要相加的数字列表

  // 创建并执行线程
  for (size_t i = 0; i < std::thread::hardware_concurrency(); i++) {
    threads.emplace_back(add_numbers, numbers);
  }

  // 等待所有线程结束
  for (auto& thread : threads) {
    thread.join();
  }

  std::cout << "Sum: " << sum << std::endl;
  return 0;
}

위 내용은 C++에서 스레드를 생성하고 관리하는 방법은 무엇입니까? 어떤 스레드 동기화 메커니즘이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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