Wenn sich alles in einem Thread abspielt
Das habe ich nicht gesagt. Multithreading-fähig muss das natürlich schon sein.
Im Prinzip müsstest du dem Lock() einen (zufälligen?) Wert übergeben den nur die Methode die das Lock() aufgerufen hat lokal kennt und der dann quasi als eine Art "Password" für das Unlock() fungiert.
Man kann sich natürlich beim Lock auch einen Syhlüssel zum Unlock geben lassen
Richtig, nur dass ich keine
GUID oder Integer nehmen würde sondern eine Interface-basierte Referenz die dafür sorgt dass spätestens dann Unlock() gemacht wird wenn man die Referenz wegwirft und man vergessen hat aufzuschließen.
Ich denke im Groben habe ich jetzt auch etwas, das Interface ist ungefähr so:
Delphi-Quellcode:
ELockException =
class(
Exception);
ELockNotHeldException =
class(ELockException);
ILock =
interface
['
{57CCCDE4-63F8-41F6-A6F0-39B4159B06FF}']
/// <exception cref="ELockNotHeldException" />
procedure UnLock();
end;
ILockableResource =
interface
['
{88085418-BD27-4B5D-AD00-B456C8E017A7}']
function TryLock(
out lock: ILock;
const timeout: TTimeSpan
): Boolean;
overload;
function TryLock(
out lock: ILock): Boolean;
overload;
end;