Je veux avoir deux procédures qui peuvent s'appeler l'une l'autre, ou être appelées à partir de n'importe quel threads en cours d'exécution, mais n'en avoir qu'une qui court à la fois. Comment puis-je faire ceci? Est-ce que cela fonctionnera correctement?Puis-je imbriquer des sections critiques? Est-ce que TCriticalSection est emboîtable?
var
cs: TCriticalSection;
procedure a;
begin
cs.Acquire;
try
// Execute single threaded here.
finally
cs.Release;
end;
end;
procedure b;
begin
cs.Acquire;
try
// Execute single threaded here. Maybe with calls to procedure a.
finally
cs.Release;
end;
end;
Merci. Je suis d'accord qu'il n'y a pas besoin d'imbrication tant que la hiérarchie de classe coïncide avec les choses à verrouiller, ce qui serait normalement le cas avec un bon design, mais pense qu'il serait possible de construire un cas où cela ne se produirait pas. (Mon programme n'en fait pas partie, je triche juste.) – soid
@soid: Mais si vous implémentez le verrouillage via des singletons thread-local, alors il n'y aurait aucun moyen de ré-acquérir la même section critique à partir du même thread . Et chaque cas d'utilisation pourrait encore être mis en œuvre. IMO il n'y a pas de réel (comme dans "il n'y a pas d'autre moyen") besoin de sections critiques récursives. – mghie
@mghie: Cela ressemble à une solution soignée. Je vous remercie. – soid