web-dev-qa-db-fra.com

Exécution de deux threads en même temps

Je veux savoir si un programme peut exécuter deux threads en même temps (c'est essentiellement ce pour quoi il est utilisé correctement?). Mais si je devais faire un appel système dans une fonction où il s'exécute sur le thread A, et avoir d'autres tâches en cours d'exécution dans une autre fonction où il s'exécute sur le thread B, seraient-ils tous deux capables de s'exécuter en même temps ou mon deuxième attendre la fin de l'appel système?

Complément à ma question initiale: ce processus serait-il toujours un processus ininterrompu pendant que l'appel système est en cours? Je parle d'utiliser n'importe quel appel système sur UNIX/LINUX.

23
user2644819

Le multi-threading et le traitement parallèle sont deux sujets complètement différents, chacun digne de sa propre conversation, mais dans un souci d'introduction ...

Filetage :
Lorsque vous lancez un exécutable, il s'exécute dans un thread au sein d'un processus. Lorsque vous lancez un autre thread, appelez-le thread 2, vous avez maintenant 2 chaînes d'exécution (threads) exécutées séparément dans le même processus. Sur un microprocesseur monocœur (uP), il est possible d'exécuter plusieurs threads, mais pas en parallèle. Bien que, théoriquement, les threads s'exécutent souvent en même temps , ils s'exécutent en fait consécutivement dans des tranches de temps allouées et contrôlées par le système d'exploitation. Ces tranches sont entrelacées les unes avec les autres. Ainsi, les étapes d'exécution du thread 1 ne se produisent pas réellement en même temps que les étapes d'exécution du thread 2. Ces comportements s'étendent généralement à autant de threads que vous créez, c'est-à-dire des paquets de chaînes d'exécution travaillant tous dans le même processus et partageant le temps tranches distribuées par le système d'exploitation.

Ainsi, dans votre exemple d'appel système , cela dépend vraiment de ce qu'est l'appel système pour savoir s'il se terminera ou non avant d'autoriser les étapes d'exécution du autre thread pour continuer. Plusieurs facteurs jouent dans ce qui va se passer: est-ce un appel bloquant? Un thread a-t-il plus de priorité que l'autre? Quelle est la durée des tranches de temps?

Liens relatifs au filetage en C:
Exemple SO
POSIX
ANSI C

Traitement parallèle :
Lorsque l'exécution d'un programme à plusieurs threads se produit sur un système à plusieurs cœurs (plusieurs uP ou plusieurs uP à plusieurs cœurs), les threads peuvent s'exécuter simultanément ou en parallèle car différents threads peuvent être séparés en cœurs séparés pour partager la charge de travail. Ceci est un exemple de traitement parallèle.

Encore une fois, sur le plan conceptuel, le traitement et le filetage parallèles sont similaires dans la mesure où ils permettent de faire les choses simultanément . Mais ce n'est qu'un concept, ils sont vraiment très différents, tant dans l'application cible que dans la technique. Lorsque le threading est utile pour identifier et fractionner une tâche entière dans un processus (par exemple, un serveur TCP/IP peut lancer un thread de travail lorsqu'une nouvelle connexion est demandée, puis se connecte et maintient cette connexion tant qu'elle reste ), le traitement parallèle est généralement utilisé pour envoyer des composants plus petits de la même tâche (par exemple, un ensemble complexe de calculs qui peuvent être effectués indépendamment dans des emplacements séparés) désactivé pour des ressources distinctes (cœurs ou uPs) à terminer simultanément. C'est là que plusieurs processeurs de base font vraiment la différence. Mais le traitement parallèle tire également parti de plusieurs systèmes, populaires dans des domaines tels que génétique et MMORPG jeux.

Liens relatifs au traitement parallèle en C :
OpenMP
Plus OpenMP (exemples)
Gribble Labs - Introduction à OpenMP
CUDA Tookit de NVIDIA

Lecture supplémentaire sur le thème général du filetage et de l'architecture:

Ce résumé du filetage et de l'architecture raye à peine la surface. Le sujet comporte de nombreuses parties. Les livres pour les traiter seraient remplir une petite bibliothèque, et il y a milliers de liens. Il n'est pas surprenant que dans le sujet plus large, certains concepts ne semblent pas suivre la raison. Par exemple, il n'est pas acquis que le simple fait d'avoir plus de cœurs se traduira par des programmes multi-threads plus rapides.

41
ryyker

Oui, ils s'exécuteraient, au moins potentiellement, "en même temps", c'est exactement à cela que servent les threads; bien sûr, il y a beaucoup de détails, par exemple:

  • Si les deux threads exécutent des appels système, par exemple écrire dans le même descripteur de fichier, ils peuvent se bloquer temporairement.

  • Si des primitives de synchronisation de thread comme des mutex sont utilisées, l'exécution parallèle sera bloquée.

  • Vous avez besoin d'un processeur avec au moins deux cœurs pour que deux threads s'exécutent réellement en même temps.

C'est un sujet très vaste et très complexe.

6
Seg Fault
  • Si votre ordinateur ne dispose que d'un seul processeur, vous devez savoir comment il peut exécuter plusieurs threads en même temps.

  • Dans les systèmes à processeur unique, un seul thread d'exécution se produit à un instant donné. car les systèmes à processeur unique prennent en charge la concurrence logique, et non la concurrence physique.

  • Sur les systèmes multiprocesseurs, plusieurs threads s'exécutent en fait en même temps et la concurrence physique est atteinte.

  • La caractéristique importante des programmes multithread est qu'ils prennent en charge la simultanéité logique, et non si la simultanéité physique est réellement atteinte.

2
Khaula Fathima

Les bases sont simples, mais les détails deviennent complexes très rapidement.

Vous pouvez diviser un programme en plusieurs threads (si cela est logique de le faire), et chaque thread s'exécutera "à son propre rythme", de sorte que si l'on doit attendre, par exemple, des E/S de fichiers qui ne ralentissent pas les autres.

Sur un seul processeur, plusieurs threads sont pris en charge en "découpant le temps" en quelque sorte - soit sur une base d'horloge simple, soit en laissant un thread s'exécuter jusqu'à ce qu'il doive attendre (par exemple, pour les E/S), puis en "basculant" sur le suivant. fil. Il y a tout un art/science à faire pour une efficacité maximale.

Sur un multiprocesseur (comme la plupart des PC modernes qui ont de 2 à 8 "cœurs") chaque thread est assigné à un processeur séparé, et s'il n'y a pas assez de processeurs, ils sont partagés comme dans le cas d'un seul processeur.

L'ensemble du domaine consistant à garantir "l'atomicité" des opérations par un seul thread et à garantir que les threads n'interfèrent pas les uns avec les autres est incroyablement complexe. En général, il existe une catégorie d'appel système "noyau" ou "noyau" qui ne sera pas interrompue par un autre thread, mais c'est seulement un petit sous-ensemble de tous les appels système, et vous devez consulter la documentation du système d'exploitation pour savoir quelle catégorie a appel système particulier tombe dans.

1
Hot Licks

Oui, un programme peut exécuter deux threads en même temps.

il s'appelle Multi threading .

seraient-ils tous les deux capables de s'exécuter en même temps ou ma deuxième fonction attendrait-elle la fin de l'appel système?

Ils peuvent tous les deux fonctionner en même temps.


si vous le souhaitez, vous pouvez faire attendre le thread B jusqu'à ce que le thread A se termine ou inverser

1
Gangadhar

Ils s'exécuteront en même temps, car un thread est indépendant d'un autre, même si vous effectuez un appel système.

Il est assez facile de le tester, vous pouvez créer un thread qui imprime quelque chose sur la sortie de la console et effectuer un appel système sur un autre thread, qui, vous le savez, prendra un temps raisonnable. Vous remarquerez que les messages continueront d'être imprimés par l'autre fil.

1
fvdalcin

Deux threads ne peuvent s'exécuter simultanément que s'il s'exécute sur un système à plusieurs processeurs, mais s'il n'a qu'un seul processeur, deux threads ne peuvent pas s'exécuter simultanément. Donc, un seul thread s'exécute à la fois et s'il termine son travail, le thread suivant qui est en file d'attente prend le temps.

0
Nitin Vats