我正在嘗試找出我認為物件的全域 TCriticalSection 存在的問題。示例代碼:
TMyObject = class
private
FCS: TCriticalSection;
FInternalObject: TSomeInternalObject;
public
constructor Create;
destructor Destroy; override;
procedure WorkWithObjectA(Data: TDataTypeA);
procedure WorkWithObjectB(Data: TDataTypeB);
end;
constructor TMyObject.Create;
begin
FCS := TCriticalSection.Create;
FInternalObject := TSomeInternalObject.Create;
end;
destructor TMyObject.Destroy;
begin
FInternalObject.Free;
FCS.Free;
inherited;
end;
procedure TMyObject.WorkWithObjectA(Data: TDataTypeA);
begin
FCS.Enter;
try
FInternalObject.DoProcessA(Data);
finally
FCS.Leave;
end;
procedure TMyObject.WorkWithObjectB(Data: TDataTypeB);
begin
FCS.Enter;
try
FInternalObject.DoProcessB(Data);
finally
FCS.Leave;
end;
問題:如果多個執行緒同時呼叫這兩個程序,如果 WorkWithObjectA() 阻塞,TCriticalSection 會阻塞 WorkWithObjectB() 嗎?這是一個更復雜情況的簡化版本。這兩個程式使用了截然不同的結構,因此不能輕易地組合成一種阻塞方法......想法?
uj5u.com熱心網友回復:
是的,如果多個執行緒同時呼叫這兩個程序,TCriticalSection 將同時阻塞 WorkWithObjectB() 和 WorkWithObjectA()。
請注意,在復雜情況下,WorkWithObjectB() 將呼叫 WorkWithObjectA(),則不會出現死鎖。僅當呼叫在尚未擁有鎖的執行緒的背景關系中時才會發生鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503906.html
標籤:德尔福
