3

我希望有两个可以相互调用的过程,或者从正在运行的任何线程中调用,但一次只能运行一个。我怎样才能做到这一点?这会正常工作吗?

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;
4

2 回答 2

7

是的,这会奏效。过程 A 可以在同一个线程中调用 B,反之亦然,当线程 A 正在使用过程 A 或 B 时,线程 B 在它想要使用这些过程时必须等待。

请参阅有关关键部分的 MSDN 文档:http: //msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx

关键部分可以嵌套,但每次调用 Acquire 都必须调用 Release。因为你在 try .. finally 子句中有你的 Release 调用,所以你确保发生这种情况,所以你的代码很好。

于 2010-09-02T11:55:33.277 回答
1

虽然在 Windows 上可以多次获取临界区,但并非在所有平台上都可以,其中一些平台会阻止重新获取同步对象的尝试。

这里实际上不需要允许“嵌套”。如果你正确地设计你的类,以公共接口获取和释放临界区的方式,而实现方法没有,并且如果你确保实现方法从不调用接口方法,那么你不需要那个特定的特征。

另请参阅堆栈溢出问题“递归锁(互斥锁)与非递归锁(互斥锁)”,了解有关递归互斥锁/临界区获取的不利方面的一些详细信息。

于 2010-09-02T12:11:14.750 回答