Будет ли деструктор 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() для блокировки, прежде чем уничтожать мьютекс.