J'ai une situation dans laquelle un bloc de code ne doit être exécuté que si deux objets de casier sont libres.
J'espérais qu'il y aurait quelque chose comme: p> Cependant, il semble n'y avoir rien de tel. Cela signifie donc que la seule façon de faire cela est: p> cela fonctionnera même comme prévu? Bien que le code compile, mais je ne suis pas sûr que cela atteindrait ce que je m'y attendrait. P> P>
3 Réponses :
Demander le verrou sur les deux devrait fonctionner correctement. Une chose que vous devez faire très attention ici est la commande. Si vous allez faire cela, assurez-vous de toujours em> obtenir le verrouillage sur verrouillage (a) code> bloquera jusqu'à ce que
A code> soit gratuit. Une fois que vous avez cette serrure,
verrouillage (B) code> bloquera jusqu'à ce que vous ayez
B code>. Après cela, vous avez les deux. P>
A code> avant d'obtenir le verrouillage sur
B code>. Sinon, vous pourriez très facilement vous retrouver dans une situation d'impasse. P>
Je m'attendrais à ce qu'il soit, bien qu'il y aurait un cas où cela pourrait potentiellement causer une condition d'impasse. P>
Normalement, le code tentera de verrouiller Toutefois, si un autre code a déjà reçu un verrouillage sur A code>, puis de verrouiller
b code> si cela a réussi. Cela signifie qu'il ne serait exécuté que le code s'il pourrait verrouiller les deux
A code> et
B code>. Qui est ce que vous voulez. P>
B code>, ce code ne fera pas ce que vous attendez. Vous auriez également besoin de vous assurer que partout où vous devez verrouiller à la fois
A code> et
B code> Vous essayez d'obtenir les serrures dans le même ordre. Si vous obtenez
B code> d'abord, puis
a code> vous causeriez une impasse. P>
En fait, il ne manquera pas si quelque chose d'autre a une serrure sur B -, il attendra que cela soit libéré.
@Tomtom: Si l'autre thread tente d'accéder à l'un des verrous, nous n'aurons aucun problème, mais s'il essaie de verrouiller à la fois A et B et dans l'ordre inverse, il y a de bonnes chances pour une impasse. @ChRISF: Est-ce qu'ils sont les bretelles frisées extérieures nécessaires dans votre édition ou que vous l'avez fait pour que le code soit plus propre?
@Gunner - juste une tentative de rendre le code plus propre et clarifiez la portée de la serrure. J'espère que ça va.
@CHRISF: Ah ça va. Je suppose que ces scopes de verrouillage fonctionnent tout comme d'autres contextes de slogement. Par exemple, dans de nombreux cas de boucle imbriquée, nous ne placons généralement pas d'accolades bouclées pour la boucle extérieure.
@Gunner - Oui, finalement juste une question de style de codage, mais je pense que cela ajoute un peu de clarté lors de la visualisation de code en dehors d'une IDE où vous n'avez pas les outils pour vous aider.
Il suffit d'ajouter mes deux cents (seulement un an plus tard), ce problème de commande que tout le monde danse s'appelle le problème des philosophes de restauration: en.wikipedia.org/wiki/dining_philosophers_problem
lock(b) lock(a) { // this scope is in critical region }
Cela ne pourrait-il pas causer des problèmes de verrouillage? Dites à un objet verrouille A, et un autre verrouille B, maintenant, vous auriez une impasse où Object1 bloque une attente de B et d'objet2 Blocs B attendre un. Je ne suis pas aussi familier avec des serrures, mais cela semble juste mauvais.
C'est pourquoi l'ordre de verrouillage est important, car toutes les réponses ont été mentionnées jusqu'à présent. Parfois, vous devez avoir plusieurs serrures et, dans ces cas, l'un des modèles standard à utiliser consiste à appliquer (par la Convention au moins) une commande sur les serrures. Par exemple, vous diriez à tout moment, vous voulez obtenir le verrouillage sur B vous Doit i> d'abord obtenir le verrouillage d'un. Provoque plus de conflit, mais empêche les blocages. Il est toujours préférable d'éviter ce genre de chose si possible, mais parfois c'est nécessaire.
@ Tester101: Oui, je suis conscient que sinon manipulé correctement, cela entraînera une impasse.