Будет ли деструктор boost::recursive_mutex::scoped_locks ссылаться на разблокированный мьютекс?

После звонка unlock() на boost::recursive_mutex::scoped_lockБудет ли объект блокировки ссылаться на мьютекс в деструкторе?

Блокировка по-прежнему сохраняет ссылку на мьютекс после вызова разблокировки (т.е. mutex() возвращает тот же указатель). Должен release() также вызываться на блокировку в случае, если мьютекс уничтожен до того, как блокировка выйдет из области видимости?

1 ответ

Решение

Посмотрим на код деструктора unique_lock из Boost 1.42:

    ~unique_lock()
    {
        if(owns_lock())
        {
            m->unlock();
        }
    }

Он будет пытаться разыменовать свой указатель на ваш (теперь недействительный) мьютекс, если он владеет блокировкой. Если вы уже вызывали unlock для этого scoped_lock, то это не должно вызывать проблем в этой реализации (которые, хотя и маловероятно, могут измениться в будущих версиях библиотеки).

Однако лучше всего убедиться, что ваши объекты уничтожены в таком порядке, что зависимые объекты уничтожаются до их зависимостей. Если вы не можете гарантировать это, то, как вы правильно сказали, вы должны вызвать release() для блокировки, прежде чем уничтожать мьютекс.

Другие вопросы по тегам