[Я не нашел удовлетворительного ответа на это, поэтому задал вопрос.]Должен ли класс оболочки для объекта, защищенного потоком, быть потокобезопасным?
Предположим, что у меня есть потокобезопасный класс C++ «ThreadSafeClass». Теперь я написал обертку над ней «MyWrapper». В MyWrapper нет другого члена данных. У меня есть несколько сомнений здесь:
- Связаны ли отдельные методы этого класса-оболочки с помощью мьютекса, чтобы сделать их потокобезопасными? Или можно с уверенностью предположить, что, поскольку базовый объект является потокобезопасным, поэтому нет необходимости?
Если ответ на < 1> выше нет (в обертке нет мьютекса), то рассмотрим это: мы не защищаем класс-оболочку с помощью любого мьютекса, предполагая, что доступ к единственному базовому объекту всегда будет потокобезопасным. Теперь предположим, что 1 поток находится в деструкторе объекта-обертки, а другой поток обращается к его функции-члену (при условии, что класс-оболочка не имеет никакого мьютекса, чтобы избежать этой ситуации). Возможно ли, что объект, защищенный потоком, был уничтожен одним потоком, а затем другой поток пытается получить к нему доступ? Я знаю, это звучит немного странно и, скорее всего, я чего-то не хватает, но это зависит от ответа на вопрос < 1> выше.
class MyWrapper { private: ThreadSafeClass _ts_obj; public: void foo() { _ts_obj.do_something(); } };
В этом случае вам не нужен дополнительный «мьютекс». – Arunmu
Вызов метода, непосредственно с тем же объектом класса или косвенно через оболочку, содержащую объект, одинаково безопасен. Понятие одного потока в деструкторе обертки аналогично тому, как один поток находится в деструкторе объекта, так как он также будет разрушен. Не рекомендуется использовать один поток для объекта класса, а другой его разрушает. – doug
Я думаю, вам нужно определить, что вы подразумеваете под термином «потокобезопасный объект». – Galik