История изменений
Исправление dvetutnev, (текущая версия) :
У каждого потока копия shared_ptr
на экземпляр Q
(в функцию th_fn
указатель передается по значению), пока жива хотя бы одна копия объект будет жив. Декремент счетчика в shared_ptr
, выполняется с семантикой release, соответственно вызов q->incr()
не может быть перепланирован позже атомарного декремента в shared_ptr
, если точнее соседние потоки никогда не увидят инкремент в Q
позже декремента счетчика в shared_ptr
. Хотя для этого сферического в вакууме примера это значения не имеет, все равно никто не использует экземпляр Q
после разрушения локальной копии shared_ptr
в каждом треде.
Прикрывать мьютексом обращения к полям (в данном случаи только инкремент) в Q
- да, прикрывать мютексом (что?) в деструкторе - нет.
Исходная версия dvetutnev, :
У каждого потока копия shared_ptr
на экземпляр Q
(в функцию th_fn
указатель передается по значению), пока жива хотя бы одна копия объект будет жив. Декремент счетчика в shared_ptr
, выполняется с семантикой release, соответственно вызов q->incr()
не может быть перепланирован позже атомарного декремента в shared_ptr
, если точнее соседние потоки никогда не увидят инкремент в Q
позже декремента счетчика в shared_ptr
. Хотя для этого сферического в вакууме примера это значения не имеет, все равно никто не использует экземпляр Q
после локальной разрушения копии shared_ptr
в каждом треде.
Прикрывать мьютексом обращения к полям (в данном случаи только инкремент) в Q
- да, прикрывать мютексом (что?) в деструкторе - нет.