4

我不确定我是否理解正确。TryEnterCriticalSection只调用一次,它不像棒EnterCriticalSection?例如,如果我写类似

if(TryEnterCriticalSection (&cs))
{
//do something that must be synh
LeaveCriticalSection(&cs);
}
else
{
//do other job
}
//go on

如果TryEnterCriticalSection返回 false,则该部分do something that must be synh将永远不会完成,并且do other job部分将被执行,然后go on

4

4 回答 4

6

TryEnterCriticalSection()执行以下操作:

  • 试图进入临界区
  • 如果该部分当前被某个其他线程抓取,则该部分未进入并且该函数返回零,否则
  • 进入该部分并且函数返回非零

无论如何,该功能永远不会阻塞。将其与EnterCriticalSection()没有其他线程进入临界区的情况进行比较,如果存在其他线程则阻塞。

因此,您的代码的结果将取决于调用函数时另一个线程是否进入了临界区。不要忘记LeaveCriticalSection()每次TryEnterCriticalSection()返回非零(成功)时调用。

所以是的,你的代码是用正确的假设编写的。

于 2011-07-26T11:55:33.630 回答
2

你猜对了。TryEnterCriticalSection()被调用一次,并且只尝试进入临界区一次。如果临界区被锁定,则检查后返回 false。

通常,如果函数返回布尔值或 int,则 if/else 子句的行为如下所示:

if (function()) //function() is called once here, return result is checked
{
  //executed if function() returned true or non-zero
}
else
{
  //executed if function() returned false or zero
}
//executed whatever happens
于 2011-07-26T11:56:25.147 回答
0

是的,您的代码是正确的。

在MSDN上查看更多信息。

于 2011-07-26T11:55:50.050 回答
0

如果您的临界区太小,那么您必须TryEnterCriticalSection在循环中尝试此操作,因为它将获得更少的时钟周期来进入临界区并离开该临界区。

于 2016-04-22T07:38:58.500 回答