деструктору статического класса нужен мьютекс? - PullRequest
3 голосов
/ 02 июня 2009

У нас есть статический (одноэлементный) класс, который будет использоваться в многопоточной среде. Мы используем mutex в его конструкторе и других функциях mrmber. Однако для деструктора мьютекса нет. Деструктор выполняет некоторые задачи, такие как очистка других объектов-членов и т. Д. Нужен ли нам мьютекс в дистракторе?

Ответы [ 4 ]

3 голосов
/ 02 июня 2009

С точки зрения доступа к объекту, который разрушает деструктор, нет, он не должен использовать мьютекс. Код вызова отвечает за то, чтобы деструктор вызывался один раз и только один раз; это не ответственность деструктора.

С точки зрения доступа к любым другим данным или ресурсам, нет ничего особенного в доступе к ним от деструктора. Они будут или не будут нуждаться в защите мьютексами одинаково, независимо от того, вызываются они из этого деструктора или из любой обычной функции.

2 голосов
/ 02 июня 2009

То же самое обоснование , которое Дейв дает деструктору, применяется к конструктору. Пока объект все еще создается, к нему не должен обращаться другой поток. Гарантируется, что конструктор будет запускаться только одним потоком (вы не можете создать его дважды), но вы должны гарантировать, что ни один поток не получит доступ к объекту до того, как он будет полностью построен.

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

Это общий рецепт для всех типов классов с использованием конструктора и деструктора , используемого в языковом смысле. Теперь с синглетами сценарий немного более конкретен. Обычно, когда вы говорите о конструкторе синглтона, вы фактически говорите о статическом методе, который создает объект, но не о реальном конструкторе . Этот статический метод обычно имеет механизмы синхронизации, которые могут включать статический мьютекс.

Прежде чем углубляться в дискуссии о том, что такое уничтожение синглтона, вы должны указать, каково ваше предназначение. Будет ли синглтон уничтожен и воссоздан много раз за время существования приложения? Будет ли он создан один раз и жить вечно? Как вы реализуете синглтон? Эти вопросы являются отправной точкой для принятия решения о том, когда, где и когда вам нужны примитивы синхронизации.

0 голосов
/ 02 июня 2009

Если деструктор изменяет некоторые глобальные данные (например, глобальный счетчик и т. Д.) Или некоторый общий ресурс, то вам нужен мьютекс. В противном случае защита деструктора как такового означает проблему его дизайна. Ни в коем случае поток не должен пытаться удалить объект, когда он используется другим потоком.

0 голосов
/ 02 июня 2009

Если у вас есть несколько потоков, которые пытаются удалить объект, тогда ваш дизайн серьезно неверно.

Вы должны использовать синхронизацию только в функции-члене, которая дает вам уникальный экземпляр, потому что имеет смысл иметь несколько объектов, запрашивающих экземпляр, но должен быть только один момент, когда вы решаете отбросить объект и не использовать его больше.

...