Avec l'amélioration continue des performances du matériel informatique, le besoin des gens en matière de traitement multicœur devient de plus en plus fort. Dans le même temps, les systèmes d'exploitation modernes offrent également une prise en charge de plus en plus complète de la programmation simultanée, ce qui fait de la programmation simultanée un élément indispensable du domaine de la programmation. Dans ce contexte, C++, en tant que langage de programmation hautes performances largement utilisé, fournit également de nombreux outils et bibliothèques de programmation simultanée puissants.
Cet article présentera quelques concepts et techniques de base de programmation simultanée C++ et démontrera leur utilisation à travers un exemple de code simple.
Bases du multi-threading
Le multi-threading est un modèle de programmation simultanée couramment utilisé qui permet à un programme d'exécuter plusieurs flux d'instructions en même temps. En C++, la programmation multithread peut être réalisée via le fichier d'en-tête
#include <iostream> #include <thread> void hello() { std::cout << "Hello" << std::endl; } int main() { std::thread t(hello); t.join(); return 0; }
Ce code définit une fonction nommée hello, qui affichera la chaîne "Hello". Dans la fonction principale, le programme crée un nouveau thread t et utilise la fonction hello comme fonction d'exécution du thread. L'instruction t.join() attend la fin de l'exécution du thread avant de quitter le programme.
Verrouillage Mutex
En raison de l'exécution simultanée de plusieurs threads, les mêmes ressources partagées sont accessibles en même temps. À l’heure actuelle, un mécanisme est nécessaire pour garantir qu’un seul thread puisse accéder à la ressource partagée à tout moment. Ce mécanisme est un verrou mutex.
En C++, vous pouvez utiliser le fichier d'en-tête
#include <iostream> #include <thread> #include <mutex> std::mutex m; int sum = 0; void add() { m.lock(); sum += 1; m.unlock(); } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
Ce code définit une fonction nommée add, qui augmentera la somme des variables globales de 1. Dans la fonction principale, le programme crée deux nouveaux threads t1 et t2 et utilise la fonction add comme fonction d'exécution. Puisque sum est une ressource partagée, un verrou mutex m est utilisé dans la fonction add pour garantir que l'accès à sum est thread-safe.
Opération atomique
L'opération atomique est une opération spéciale qui peut mettre à jour ou lire des ressources partagées sans verrouillage. En C++, vous pouvez utiliser le fichier d'en-tête
#include <iostream> #include <thread> #include <atomic> std::atomic<int> sum(0); void add() { sum += 1; } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
Ce code définit une variable atomique nommée sum, dont la valeur initiale est 0. Dans la fonction add, l'opération atomique sum += 1 est utilisée pour augmenter la valeur de sum de 1. Dans la fonction principale, le programme crée deux nouveaux threads t1 et t2 et utilise la fonction add comme fonction d'exécution. Puisque sum est une variable atomique, l'opération atomique sum += 1 peut garantir la sécurité des threads.
Résumé
Cet article présente les bases de la programmation simultanée en C++, y compris le multithreading, les verrous mutex et les opérations atomiques. Bien entendu, C++ fournit bien plus d’outils et de bibliothèques de programmation simultanée que ceux-ci, tels que des variables de condition, des sémaphores, des pools de threads, etc. Dans les projets réels, le choix des outils de programmation simultanée et des bibliothèques appropriés est d'une grande importance pour garantir l'exactitude du programme et améliorer ses performances et sa maintenabilité.
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!