在我的项目中,我有一个可能由线程本身、其他线程或 VCL(主应用程序)修改的线程。因此,我对每次数据访问都使用 TCriticalSection.Acquire / Release。
正常情况下,下面的代码按预期工作:进入Acquire,Synchronizes with DoCallback,然后释放锁。但是,如果任何其他上下文在它已经被锁定的时候获得了锁,那么下面的代码的执行将在 Synchronize 处停止——并且这一次,它不会进入 DoCallback 方法。
我是否应该跳过 Synchronize 方法(即使 Synchronize 的代码调用 VCL)并依赖于 CriticalSection 本身?这种行为的原因是什么?
主线程代码:
fData:= nil;
try
fSingleRequest.Acquire;
if fItem <> nil then
begin
fData:= fItem.Request;
SubmitRequest();
fCallbackData:= fItem.fExtraData;
fCallback:= fItem.fCallback;
Synchronize(DoCallback); // <-- this line is called
end;
finally
fSingleRequest.Release; // <-- this isn't under the specific situation
end;