Есть data race прям как в примере тут: https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces#dat...
<Для Ъ>:
struct Base {
virtual ~Base() {
unregister(this); // внутри сложный код с синхронизацией
}
virtual void someMethod() = 0;
};
struct Derived : public Base {
~Derived() { simpleDestruction(); }
void someMethod() override;
};
Проблема такова, что деструктор и someMethod() могут быть вызваны с разных потоков. А используемые в проекте реализации GCC/Clang меняют vptr при вызове родительских деструкторов. Соотв. если во время синхронизации в ~Base() будет вызван someMethod() получится pure virtual method call. (так как используемые компиляторы GCC).
</Для Ъ>
Было бы дешево и сердито решить проблему переносом синхронизации в деструктор дочернего класса, однако в реальности ситуация такова, что существует дерево из 6 потомков класса Base:
Base_______________
| \ \
Derived1 Derived2 Derived3
| |
Derived11 Derived21
|
Derived111
Подскажите пожалуйста как поправить проблему? Может существует какой-нибудь паттерн для такого?