Есть 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
Подскажите пожалуйста как поправить проблему? Может существует какой-нибудь паттерн для такого?












