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.