Будет ли деструктор boost :: recursive_mutex :: scoped_locks ссылаться на разблокированный мьютекс? - PullRequest
1 голос
/ 11 марта 2011

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

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

1 Ответ

1 голос
/ 11 марта 2011

Глядя на код деструктора unique_lock из Boost 1.42:

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

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

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

...