Maison > développement back-end > C++ > Comment créer et gérer des threads en C++ ? Quels sont les mécanismes de synchronisation des threads ?

Comment créer et gérer des threads en C++ ? Quels sont les mécanismes de synchronisation des threads ?

王林
Libérer: 2024-05-07 21:03:01
original
561 Les gens l'ont consulté

Les threads en C++ Les threads sont des unités d'exécution légères qui permettent la programmation simultanée. Utilisez la classe std::thread pour créer des threads et maintenir la cohérence des données partagées via des mécanismes de synchronisation tels que les mutex, les variables de condition et les verrous tournants. Le cas pratique montre le processus d'utilisation de threads pour calculer la somme simultanément.

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

Création et gestion de threads en C++

Les threads sont des unités d'exécution légères qui partagent le même espace d'adressage avec les processus, permettant une programmation simultanée.

Créer un thread

En C++, utilisez la classe std::thread pour créer un thread :

#include <thread>

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

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

Mécanisme de synchronisation des threads

Pour maintenir la cohérence des données partagées entre les threads, vous devez utiliser un mécanisme de synchronisation :

Mutex (Mutex )

#include <mutex>

std::mutex mutex;

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

Condition Variable

#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; });
  // 条件满足时,继续执行
}
Copier après la connexion

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);
}
Copier après la connexion

Cas pratique

Calcul et sommation simultanés

#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;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal