Проверьте дополнительный мьютекс перед блокировкой области
У меня есть конструктор, который по желанию позволяет пользователю передать Ponter в Boost мьютекс. Если мьютекс не указан, указатель на член pMyMutex
установлен в NULL
, Это дает пользователю возможность применить некоторую безопасность потока, если он пожелает. Тем не менее, я не могу использовать scoped_lock
с такой проверкой по понятным причинам:)
if (pMyMutex != NULL)
const boost::mutex::scoped_lock l(*pMyMutex);
//The lock is already out of scope
processStuff(x, y, z);
Кто-нибудь может предложить аккуратное и простое решение для такого требования?
1 ответ
Решение
Реализуйте свою собственную оболочку, аналогичную scoped_lock, чтобы скрыть принятое в ней решение: заключить указатель в мьютекс и проверить, равен ли указатель нулю (блокировка не применена) или нет (блокировка применена). Какой-то скелет:
class ScopedLockEx
{
public:
ScopedLockEx( boost::mutex* pMutex)
: pMutex_( pMutex)
{
if( pMutex_) pMutex_->lock();
}
~ScopedLockEx()
{
if( pMutex_) pMutex_->unlock();
}
private:
boost::mutex* pMutex_;
};