У вас здесь хорошая интуиция; lock_guard
в деструкторе не приносит никакой пользы.
И вот почему:
Как это написано, любые вызовы send()
должны быть выполнены до создания lock_guard ~MyClass()
- в противном случае сообщение не будет обработано, и send()
вполне может использовать m и my_list после завершения их уничтожения , что приводит к неопределенному поведению. Вызывающие абоненты send()
не могут быть уверены, что это произойдет, кроме как просто убедиться, что все вызовы send()
сделаны до того, как ~MyClass()
даже начнется.
Это нормально. Большинство классов имеют (или должны иметь) требование, чтобы клиенты сериализовали уничтожение. То есть клиенты должны убедиться, что все вызывающие абоненты на send()
выполнены до вызова ~MyClass()
. Фактически, все стандартные классы библиотеки имеют это требование, если не указано иное. Некоторые классы сознательно не требуют этого; это нормально, но несколько экзотично.
К счастью, это не так уж сложно для клиентов; они могут просто использовать shared_ptr или что-то еще, как предлагает Jarod42.
ТЛ; др:
существует ли вероятность, что поток вызовет send между снятием блокировки и фактическим уничтожением экземпляра?
Да! Документируйте, что это ошибка клиента, если они делают это и избавляются от блокировки в деструкторе.