TryEnterCriticalSection - PullRequest
       3

TryEnterCriticalSection

3 голосов
/ 26 июля 2011

Я не уверен, правильно ли я понимаю.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 ]

5 голосов
/ 26 июля 2011

TryEnterCriticalSection() выполняет следующие действия:

  • пытается войти в критическую секцию
  • , если эта секция в настоящий момент захвачена каким-либо другим потоком, секция не вводится, и функция возвращаетноль, иначе
  • раздел введен и функция возвращает ненулевое значение

В любом случае функция никогда не блокируется.Сравните его с EnterCriticalSection(), который проваливается, если ни один другой поток не ввел критическую секцию, и блокирует, если такой другой поток существует.

Таким образом, результат вашего кода будет зависеть от того, введена ли критическая секция другим потокомна данный момент функция вызывается.Не забывайте вызывать LeaveCriticalSection() каждый раз, когда TryEnterCriticalSection() возвращает ненулевое значение (успешно).

Так что да, ваш код написан с правильными предположениями.

2 голосов
/ 26 июля 2011

Вы правильно догадались. 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
0 голосов
/ 22 апреля 2016

Если ваша критическая секция слишком мала, то вы должны попробовать это TryEnterCriticalSection в цикле, потому что тогда он получит меньше тактов для входа в критическую секцию и выхода из этой критической секции.

0 голосов
/ 26 июля 2011

Да, ваш код правильный.

Подробнее о MSDN .

...