У меня есть движок состояний, который использует шаблон проектирования программного обеспечения Singleton. Доступ к движку состояний возможен из нескольких потоков. Объект инициализируется из основного потока при запуске программы и не предназначен для отложенной инициализации.
Мой вопрос заключается в том, должен ли я сделать публичные статические члены нестабильными, как это:
class CStateEngine final
{
private:
/* Contains the Singleton object */
static CStateEngine* instance;
protected:
CStateEngine();
public:
static CStateEngine* Instance() volatile; // Returns the Singleton instance
static void DeleteInstance() volatile; // Deletes the Singleton instance
}
volatile
Ключевое слово в C ++ НЕ такое же, как в других языках. В C ++ это означает, что компилятор будет следить за тем, чтобы значение всегда заново считывалось из памяти и никогда не использовалось кэшированное значение.
Он использует встроенный мир и другие места. Если вы хотите иметь всегда актуальный вид определенной переменной, вы бы отметили ее как volatile
,
Однако это не имеет ничего общего с многопоточностью.
Вы не должны использовать одноэлементную среду в многопоточной среде, потому что это будет причиной для конфликта, поскольку несколько потоков пытаются получить доступ к вашему объекту. Это приведет к отставанию ваших программ и, в первую очередь, к поражению при использовании потоков.
Вы должны передавать объекты вокруг, и вы должны иметь возможность создавать новые по мере необходимости.
Если вы не можете этого сделать, проверьте свой дизайн.
Других решений пока нет …