Проверьте дополнительный мьютекс перед блокировкой области

У меня есть конструктор, который по желанию позволяет пользователю передать 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_;
};
Другие вопросы по тегам