У меня возникли проблемы с поиском правильного проектного решения для проблемы совместного использования одного и того же объекта критической секции между двумя классами в разных иерархиях классов.
Представьте себе:
class IB;
class IA {
public: void method_one();
};
class A : public IA {
IB* m_ib;
};
class IB {
public: void method_two();
};
class B : public IB {
IA* m_ia;
};
Теперь вызовы method_one () и method_two () должны быть синхронизированы. Я случайно использую объект crit_section для синхронизации, но удивляюсь, как мне это сделать.
Мне удалось выяснить некоторые идеи:
BAD - создать подходящий элемент (critical_section m_cs;
) из A или B и
a) понижать с IA до A (или с IB до B соответственно) и использовать его
б) сделать его статическим и вызвать A::m_cs
(или B::m_cs
)
BETTER - создать дополнительный одноэлементный объект / структуру, который будет управлять объектом критической_секции и предоставлять к нему доступ:
class CriticalSectionProvider {
//(...)
public:
static critical_section& GetIt() { static critical_section cs; return cs; }
}
К сожалению, меня это не устраивает, и я думаю, что у кого-то может быть идея получше.
Как разделить одну критическую секцию между двумя классами в этом случае?