В общем случае мьютексы можно использовать для управления доступом к потокам между процессами через именованный мьютекс, в то время как критические секции предназначены только для синхронизации доступа к потокам в одном и том же пространстве процесса.
Ни один из этих классов действительно не получает преимущества RAII без их переноса, потому что в этом случае вам никогда не потребуется явно вызывать блокировку или разблокировку. Возьмем, к примеру, этот небольшой кусочек псевдокода с использованием буст-блокировки мьютекса ...
void DoSomething()
{
// construction acquires lock on mutex
boost::scoped_lock lock(&aBoostMutex);
// ...
} // end scope - object is destroyed and lock is released
Теперь я бы сказал, что вам следует избегать CMutex
, CCritalSection
, CSemaphore
и CEvent
, потому что реализации несколько сломаны или, по крайней мере, уступают другим доступным библиотекам, таким как boost. Например:
- Определение между тайм-аутом из оставленного мьютекса невозможно, поскольку реализация проверяет возвращаемое значение, а не причину.
- Нет повторных входных блокировок с использованием
CSingleLock
, поэтому рекурсия вызовет проблемы.
- Невозможность иметь именованное событие между процессами
В зависимости от того, что вам поручено, у вас может быть возможность отойти от оболочек MFC в Windows API и реализовать собственные атомарные блокировки или использовать что-то вроде boost или C ++ 0x, например std::mutex
, которые не только являются лучшими реализациями, но обеспечивают кроссплатформенную поддержку.