我希望有两个程序可以相互调用,或者从正在运行的任何线程调用,但一次只运行一个。我怎样才能做到这一点?这会正常吗?
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;
答案 0 :(得分:6)
是的,那会有效。过程A可以在同一个线程中调用B,反之亦然,当线程A使用过程A或B时,线程B必须等待它想要使用这些过程。
请参阅有关关键部分的MSDN文档:http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx
关键部分可以嵌套,但是每次调用Acquire都必须调用Release。因为您在try .. finally子句中进行了Release调用,所以确保发生这种情况,因此您的代码很好。
答案 1 :(得分:1)
虽然在Windows上可以多次获取关键部分,但是在所有平台上都不可能,其中一些会阻止重新获取同步对象的尝试。
这里没有必要允许“嵌套”。如果你正确地设计你的类,公共接口获取和释放关键部分的方式,实现方法没有,如果你确保实现方法永远不会调用接口方法,那么你不需要那个特定的特征
另请参阅Stack Overflow问题"Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex)",了解有关递归互斥/临界区获取的不良方面的一些详细信息。