2010-05-11 9 views
1

vont placer le processus parent et le processus fils dans un interblocage si le parent utilise la ressource et que l'enfant aura également la même ressource? Que faire si parent contient deux threads? l'enfant aura-t-il aussi 2 fils? Comment la fourche peut-elle être sécuritaire pour le fil?Certaines questions concernant les threads et les interblocages

+1

C'est vraiment difficile à dire. Pourquoi n'essaies-tu pas de poser une question très précise et une seule ressource, et un scénario de partage? Certaines ressources peuvent être partagées. certains ne peuvent pas. Certains peuvent être partagés à certains égards, mais pas d'autres. Par exemple, la mémoire peut généralement être lue mais pas écrite simultanément sans synchronisation, tandis que la CPU est arbitrée pour vous par le système d'exploitation. – WhirlWind

+0

Aussi, si vous croyez avoir reçu des réponses valables à vos questions, vous pouvez accepter une excellente réponse pour récompenser ceux qui ont fait des efforts pour vous aider. – WhirlWind

Répondre

2

La description d'une phrase de Wikipedia est

Une impasse est une situation dans laquelle deux ou plusieurs actions concurrentes chacun attendant que l'autre à la fin, et donc ni jamais fait.

Le cas le plus simple est deux threads et deux ressources.

Fil A:

acquireResource(r1) 
    acquireResource(r2) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

Fil B:

acquireResrouce(r2) 
    acquireResource(r1) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

Avec ce blocage de code se produit si la séquence suivante d'événements se produit.

  1. Fil A acquiert r1
  2. changement de contexte de fil B
  3. fil B acquiert A ce moment Discussion A r2

ne peut pas continuer parce qu'il r2 est déjà propriétaire et le fil B peut ne pas procéder parce que r1 est la propriété. Par conséquent, aucun thread ne peut aller jusqu'au point où il libère ses ressources. Ceci est une impasse.

Pour ce que sa valeur de cas simples comme ceci peut être évitée en s'assurant que les ressources sont acquises dans le même ordre dans tout le code. Par exemple, si le thread B acquiert r1, aucun blocage ne se produira. Il y a beaucoup d'autres façons de parvenir à l'impasse, bien qu'il soit beaucoup plus difficile à éviter.

Questions connexes