Maison > développement back-end > C++ > Programmation simultanée C++ : comment utiliser un processeur multicœur pour obtenir la concurrence ?

Programmation simultanée C++ : comment utiliser un processeur multicœur pour obtenir la concurrence ?

PHPz
Libérer: 2024-05-01 11:51:01
original
321 Les gens l'ont consulté

La programmation simultanée C++ tire pleinement parti des processeurs multicœurs en créant des threads, des mutex et des variables de condition. La création de threads permet d'exécuter des tâches en parallèle. Un mutex agit comme un verrou pour garantir que les données partagées ne sont pas accessibles simultanément par plusieurs threads, évitant ainsi la corruption des données. Les variables de condition sont utilisées pour informer un thread qu'une condition spécifique a été remplie et sont utilisées avec des verrous mutex pour empêcher un thread de continuer à s'exécuter jusqu'à ce que la condition soit remplie.

Programmation simultanée C++ : comment utiliser un processeur multicœur pour obtenir la concurrence ?

Programmation simultanée en C++ : débloquer des processeurs multicœurs

Préface

Les processeurs modernes ont souvent plusieurs cœurs, et en utilisant pleinement ces cœurs, nous pouvons améliorer considérablement l'efficacité du code lors de l'exécution de tâches en parallèle. C++ fournit une variété d'outils de programmation simultanée qui permettent aux programmeurs de créer facilement des applications capables d'effectuer plusieurs tâches simultanément.

Créer des fils de discussion

Créer des fils de discussion sont les éléments de base pour représenter la concurrence. En C++, vous pouvez créer de nouveaux threads à l'aide de la classe std::thread. Il accepte comme argument un objet appelable qui spécifie la tâche à effectuer dans un thread séparé. 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;
}
Copier après la connexion

在上面的代码中,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;
}
Copier après la connexion

在这个示例中,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;
}
Copier après la connexion

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

Dans le code ci-dessus, la fonction hello_world() est un objet appelable qui imprime simplement un message sur la console. Le constructeur std::thread crée un nouveau thread et exécute l'objet appelable. thread1.join() bloque le thread principal jusqu'à ce que le nouveau thread soit terminé. 🎜🎜🎜Verrouillage Mutex🎜🎜🎜Le verrouillage Mutex est très important lorsque les threads accèdent simultanément aux données partagées. Ils agissent comme des verrous pour empêcher plusieurs threads d'accéder simultanément aux sections critiques, évitant ainsi la corruption des données. En C++, vous pouvez créer un verrou mutex à l'aide de la classe std::mutex. 🎜rrreee🎜Dans cet exemple, la fonction increment() incrémente la variable partagée counter. Nous utilisons std::lock_guard pour obtenir un verrou mutex, garantissant qu'un seul thread peut exécuter la section critique en même temps. Ce mécanisme garantit que deux threads n'incrémentent pas counter en même temps, évitant ainsi les courses de données. 🎜🎜🎜Variables conditionnelles🎜🎜🎜Les variables conditionnelles sont utilisées pour informer les threads qu'une condition spécifique a été remplie. Ils sont utilisés avec des verrous mutex pour garantir que les threads ne poursuivent pas leur exécution tant qu'une condition n'est pas remplie. En C++, les variables de condition peuvent être créées à l'aide de la classe std::condition_variable. 🎜rrreee🎜Dans cet exemple, nous utilisons des variables de condition pour coordonner l'interaction entre les threads producteur et consommateur. La fonction producter() définit l'indicateur partagé ready sur true et informe le thread consommateur. La fonction consumer() attend que l'indicateur partagé soit vrai en attendant une variable de condition avant de poursuivre l'exécution. 🎜

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