2017-04-01 11 views
0

Comment nommer une situation lorsqu'un thread est verrouillé en attente pour toujours? J'ai trouvé plusieurs exemples sur le moment où deux fils entrent en collision, qui est appelé race condition:Posix Thread Locked: attente pour toujours

A race condition occurs when two or more threads 
can access shared data and they try to 
change it at the same time 

Mais quand un fil est stuck waiting forever for another thread, est-il un terme spécifique pour nommer cette situation, ou encore est-il encore nommé comme condition de course, même si nous avons deux threads qui n'essaient pas d'accéder aux données partagées en même temps, mais à la place ... l'un des threads s'est bloqué en attente pour le 2ème thread ?

+3

Cela s'appelle Deadlock. –

+1

..ou éventuellement livelock, si le ou les threads sont à 100% CPU. – ThingyWotsit

+0

Cela dépend de la raison pour laquelle le thread attend. Si le thread 1 utilise une ressource, puis commence à attendre qu'un autre soit libre, mais cette autre ressource ne sera jamais libre car elle a été revendiquée par le thread 2, qui attend maintenant le thread de ressources 1, c'est l'impasse (et il existe plusieurs versions de la même chose, mais elles sont toutes à peu près la même idée). Si l'un des threads attend l'autre et que l'autre ne se termine jamais pour une autre raison (par exemple une boucle infinie), c'est juste ... une boucle infinie. –

Répondre

0

Si Thread_1 attend Thread_2 et simultanément, Thread_2 attend Thread_1. C'est ce qu'on appelle une serrure à mort. Quand Dead-Lock s'est produit, c'est comme si deux threads s'entrechoquaient.

Une autre situation est appelée live-lock. Live-lock est juste la situation où il y a un thread qui attend pour toujours un autre thread. Si Thread_2 attend Thread_1. Et Thread_2 veut obtenir un verrou en écriture à partir de Thread_1. Mais à ce moment vient un autre Thread_3. Thread_3 veut également obtenir un verrou en écriture de Thread_1. Malheureusement Thread_3 a une priorité plus élevée que Thread_2. Donc, lorsque Thread_1 libère ce verrouillage en écriture. Thread_3 a obtenu ce verrouillage en écriture immédiatement. Et il vient un Thread_4, Thread_4 a la même priorité que Thread_3 ...

Thread_2 semble attendre un verrouillage en écriture pour toujours. C'est ce qu'on appelle un verrouillage direct. Pour éviter ce problème, nous pouvons créer une file d'attente pour le serveur. Quel fil est arrivé en file d'attente, nous traitons ce fil plus tôt. Pthread nous a donné des moyens servals pour verrouiller une ressource. Nous pouvons utiliser mutex ou autre chose. Mais nous devons résoudre le problème après avoir utilisé les verrous.

Vous pouvez obtenir plus d'informations à propos de ce sujet dans Contrôle de la concurrence.