Вы правы, что этот метод выглядит довольно неуклюжим и быстро становится неуправляемым. Поэтому я пытаюсь смоделировать многопоточные проблемы, преодолев зависимость от данных. Однако без дальнейшего контекста к тому, что вы пытаетесь решить, я не могу посоветовать, как смоделировать проблему.
Если вы уже вложили средства в такую архитектуру и уже слишком поздно что-либо менять, я бы подумал об этом.
template<class T>
class SharedValiable
{
private:
T myT;
boost::shared_mutex myTMutex;
public:
//
// Implement appropriate copy, assign and default
// to ensure proper value semantics
//
T getter() const
{
boost::shared_lock lock(_access);
return x;
}
void setter()
{
boost::unique_lock lock(_access);
}
}
Это позволяет защитить каждую переменную так, как вы изначально предполагали, но упрощает добавление новых или удаление членов из классов. Кроме того, шаблон может быть специализирован для определенного типа, который может использовать атомарные операции ОС, такие как int. e.g.:
template<int>
class SharedValiable
{
private:
T myT;
public:
//
// Implement appropriate copy, assign and default
// to ensure proper value semantics
//
T getter() const
{
// no need to lock, updates are atomic
return x;
}
void setter()
{
// no mutex needed we will use an atomic OS op to update
InterlockedCompareAndExchange(myT, newVal);
}
}