|
UniSet
1.4.0
|
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. Кроме особых случаев (см. Особые случаи). Если в DoSomethig() будет вызвана exit(0), abort() или что-нибудь подобное, то unlock не произойдет. В таком случае следовало бы напрямую вызывать unlock() до вызова сигнала, но эти случаи редкие и если возникнет необходимость, то можно будет вместо protected сделать их public.
1.7.6.1