Что делает CCriticalSection? - PullRequest
       0

Что делает CCriticalSection?

5 голосов
/ 10 февраля 2011

Какая разница между этим кодом:

::EnterCriticalSection( &m_CriticalSection );
//...
::LeaveCriticalSection( &m_CriticalSection );

и код:

static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();

Ответы [ 3 ]

9 голосов
/ 10 февраля 2011

Разницы практически нет. CCriticalSection - единственный синтетический сахар из первых. внутренне использует EnterCriticalSection и LeaveCriticalSection!

EnterCriticalSection и LeaveCriticalSection являются низкоуровневыми API-интерфейсами win32, в то время как CCriticalSection является классом MFC, который охватывает эти функции. Он содержит данные типа CRITICAL_SECTION, которые используются API.

MSDN говорит,

Функциональность Класс CCriticalSection предоставляется фактический Win32 CRITICAL_SECTION объект. * * тысяча двадцать-один

7 голосов
/ 10 февраля 2011

Если вы используете его таким образом, нет никакой разницы.Основным преимуществом класса является его использование следующим образом:

static CCriticalSection cs;
{
  CSingleLock lock(cs, true);
  // do your work here
} // unlocked automatically

При выходе из области критическая секция будет разблокирована, даже если было сгенерировано исключение или использовался ранний возврат.Этот метод известен как RAII (Инициализация ресурсов является инициализацией) и широко известен.

Классы синхронизации MFC не очень хорошо разработаны.Я бы порекомендовал использовать файлы boost.thread или те, которые будут доступны в новом стандарте C ++, если вы сможете их достать.

2 голосов
/ 10 февраля 2011

Инкапсулирует структуру CRITICAL_SECTION и четыре операции - InitializeCriticalSection(), EnterCriticalSection(), LeaveCriticalSection() и DeleteCriticalSection() в один класс, что делает его более удобным для написания кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...