web-dev-qa-db-fra.com

Programmation simultanée c ++?

Je continue d'entendre parler de programmation simultanée partout. Pouvez-vous nous expliquer ce que c'est et comment les nouvelles normes c ++ facilitent la même chose?

46
yesraaj

La concurrence consiste à ce que votre code fasse plusieurs choses en même temps. Cela se fait généralement avec des "threads" explicites, mais il existe d'autres possibilités. Par exemple, si vous utilisez des directives OpenMP dans votre code, un compilateur qui prend en charge OpenMP générera automatiquement des threads pour vous.

Thread est l'abréviation de "thread of execution". Dans un programme C++ monothread, l'exécution commence à main (), puis se déroule de manière séquentielle. Dans un programme multithread, le premier thread démarre à main, mais des threads supplémentaires peuvent être démarrés par l'application qui démarrent à une fonction spécifiée par l'utilisateur. Ceux-ci s'exécutent alors simultanément ou en parallèle avec le thread d'origine.

En C++ 0x, les threads sont démarrés à l'aide du std::thread classe:

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

La nouvelle norme C++ 0x prend également en charge:

  • valeurs atomiques et opérations avec le std::atomic<> modèle de classe,
  • mutex pour la protection des données (std::mutex, std::recursive_mutex, etc.)
  • classes de verrouillage pour faciliter la gestion de la durée de vie des verrous (std::lock_guard<>, std::unique_lock<>)
  • std::lock et std::try_lock fonctions pour gérer l'acquisition de plusieurs verrous en même temps sans risque de blocage
  • variables de condition pour faciliter l'attente d'un événement (std::condition_variable, std::condition_variable_any)
  • futures, promesses et tâches packagées pour simplifier le passage des données entre les threads et attendre qu'une valeur soit prête. Cela répond à la question classique "comment renvoyer une valeur à partir d'un fil".
  • initialisation thread-safe d'objets statiques locaux
  • les thread_local mot clé pour déclarer les données locales du thread

J'ai donné un aperçu plus détaillé de la nouvelle bibliothèque de threads C++ 0x dans mon article sur devx.com: Multithreading plus simple en C++ 0x

J'écris sur le multithreading et la concurrence en C++ sur mon blog . J'écris également un livre sur le sujet: C++ Concurrency in Action .

73
Anthony Williams

Lorsque vous dites "comment les nouvelles normes c ++ facilitent" la programmation simultanée, je suppose que vous parlez de la norme C++ 09 qui sera bientôt publiée (?).

La nouvelle norme, sous sa forme actuelle, prend en charge les éléments suivants qui facilitent la programmation simultanée:

  • types et adresses atomiques
  • une classe de threads
  • stockage thread_local (qui vient d'être ajouté au projet de norme il y a quelques mois)
  • exclusion mutuelle (classes mutex)
  • variables de condition - c'est particulièrement agréable pour Windows, car les variables de condition sont difficiles à implémenter correctement dans Win32. Cela signifie qu'à terme, Microsoft devrait prendre en charge les variables de condition au moins dans le runtime MSVC++, il sera donc facile d'obtenir une sémantique de variable de condition correcte sur WIn32.
17
Michael Burr

C++ CSP2 - Accès simultané facile pour C++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

Le CSP est basé sur un paradigme concurrent approprié par opposition aux threads et aux verrous et à toutes sortes d'autres choses qui sont abordées après coup.

(Voir Occam-Pi pour un langage de programmation simultané (également basé sur CSP))

5
Dynite
5
Joel Martinez

La concurrence a plusieurs threads d'exécution pour un processus donné. À ce jour, C++ ne le prend pas directement en charge. Cependant, il existe plusieurs bibliothèques qui lieront une fonction donnée à un nouveau thread d'exécution. Le standard Unix est la bibliothèque pthreads.

5
Paul Nathan

Ma prise légèrement différente, spécifique aux directions futures des paradigmes de programmation:

La concurrence consiste à écrire votre programme de telle sorte qu'il puisse faire plusieurs choses à la fois si le matériel le prend en charge. Actuellement, la plupart des langages ont des mécanismes assez lourds et compliqués pour permettre au programmeur de le spécifier (par exemple: threads avec synchronisation manuelle, directives de pré-processeur OpenMP, etc.).

À mesure que le matériel s'améliore, il s'améliorera horizontalement (plus de cœurs) plutôt que verticalement (un seul cœur plus rapide). Cela signifie que les applications devront avoir une "concurrence latente" pour évoluer avec du matériel "plus rapide". Les langues tentent actuellement d'évoluer pour mieux soutenir cela, pour être dans la position du meilleur langage pour un développement futur.

C++ 0x ajoute un support plus intégré pour les "anciennes" méthodes de programmation de la concurrence. Divers éditeurs de compilateurs ajoutent de "nouvelles" méthodes qui font abstraction du modèle de thread et permettent des décisions d'exécution sur le nombre de threads, etc. (en fonction du matériel de la machine); pour Microsoft en particulier, voir F #, runtime d'accès concurrentiel, extensions parallèles, etc.

J'espère que cela pourra aider.

3
Nick

C'est le meilleur article pour comprendre la programmation simultanée: Programmation simultanée

Vous obtiendrez l'image complète de la programmation simultanée et du C++ après l'avoir lu.

En résumé, nous pouvons dire que la programmation simultanée consiste à faire du multitâche. Lorsqu'un programme est bloqué, il peut faire autre chose. En règle générale, nous sommes bloqués en attendant les connexions réseau et en traitant les E/S. Nous pouvons faciliter la programmation simultanée en utilisant fork() et les bibliothèques de threads.

1
Marcus Thornton