如果一個執行緒試圖訪問被另一個執行緒鎖定的同一個物件會發生什么?我知道它可以被處理TMonitor.Wait(),但是如果沒有處理代碼來檢查它是否被鎖定怎么辦?會不會有錯誤?
在下面的示例中,Thread1Process鎖定物件并Thread2Process嘗試為物件的屬性賦值。在釋放鎖之前會Thread2Process自動等待Thread1Process以執行下一行var x: Integer := 1;還是會停止并拋出例外?
procedure Thread1Process(const AObject: TObjectDescendant);
begin
TMonitor.Enter(AObject);
try
// lengthy process here...
finally
TMonitor.Exit(AObject);
end;
end;
procedure Thread2Process(const AObject: TObjectDescendant);
begin
AObject.StringProperty := 'Any value';
var x: Integer := 1;
end;
我們正在使用 Delphi 11 Alexandria。
uj5u.com熱心網友回復:
TMonitor只是一個同步鎖,僅此而已。很像TMutex,TSemaphore等。
它對物件本身沒有任何作用。如果一個執行緒決定進入鎖,而第二個執行緒沒有,則第二個執行緒不會以任何方式被阻塞,也不會引發例外1,但不能保證物件或其成員的穩定性. 競態條件的發生是由于所有相關執行緒相互協作缺乏適當的同步。
1:除非物件本身決定引發例外,或者引發系統例外,例如訪問無效記憶體等。
在旁注中,您的呼叫TMonitor.Enter()需要在try塊之外,例如:
procedure Thread1Process(const AObject: TObjectDescendant);
begin
TMonitor.Enter(AObject);
try
// lengthy process here...
finally
TMonitor.Exit(AObject);
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503908.html
