UniSet 2.32.1
Как пользоваться uniset_mutex и uniset_mutex_lock
"мьютекс"(mutex) - получено от англ. Mutual Exclusive. (нечто вроде "взаимоисключение")
Основными операциями для мьютексов, помимо создания и уничтожения, являются операции lock и unlock. Логически работа с мьютексом могла бы выглядеть так (псевдокод)
Mutex mutex;
...
mutex.lock();
DoSomething();
mutex.unlock();

Но в общем случае это ни к чему хорошему не приведет, т.к. если в DoSomething() возникнет исключение, то mutex.unlock() уже не выполнится. Конечно можно использовать try...catch, но желательно, чтобы код работал независимо от ситуации. Для этого введен класс uniset_mutex_lock. При его использовании получается следующий код (один из вариантов использования):

using namespase UniSetTypes;
...
uniset_mutex mutex;
...
{
uniset_mutex_lock lock(mutex); // вызов mutex.lock() как часть кода конструктора
DoSomething();
} // <-- Заканчивается зона видимости lock-а и происходит вызов mutex.unlock() как часть кода деструктора

В этом случае, даже если в DoSomethig() будет сгенерировано исключение ресурс будет освобожден при вызове деструктора. Вот и все решение...

Главное не забывайте ставить скобочки...
Желательно не использовать mutex.lock() и uniset_mutex.unlock() в чистом виде, а только совместно с uniset_mutex_lock. Кроме особых случаев (см. Особые случаи).
Следует помнить, что мьютексы фактически никаких ресурсов не захватывают, это только флаг означающий, что ресурс занят. Поэтому работать с ними надо внимательно и не забывать блокировать ресурс там где это надо.
Описания классов см. UniSetTypes::uniset_mutex и UniSetTypes::uniset_mutex_lock

Особые случаи

Если в DoSomethig() будет вызвана exit(0), abort() или что-нибудь подобное, то unlock не произойдет. В таком случае следовало бы напрямую вызывать unlock() до вызова сигнала, но эти случаи редкие и если возникнет необходимость, то можно будет вместо protected сделать их public.

Заметки
Описание составлено на основе описания мьютексов из книги А.Цимбала "Технология CORBA для профессионалов".