C ++ Threadsafe Singleton (НЕ ДЛЯ ИНИТА) - PullRequest
0 голосов
/ 11 ноября 2009

Итак, я хочу получить доступ к одноэлементному классу из нескольких потоков. Концептуально я думаю, что вызов неконстантных методов в этом экземпляре синглтона не будет потокобезопасным. Я искал в Интернете, и никто не может решить эту возможную проблему. Есть ли реальная проблема с этим, единственная проблема с поточной безопасностью Singleton, инициализация переменной экземпляра?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Один экземпляр имеет те же проблемы безопасности потоков, что и любой другой экземпляр, поэтому вызовы его методов или доступ к его членам должны быть синхронизированы.

Инициализация самого синглтона - еще одна проблема ... в gcc статическая инициализация threadsafe , но, вероятно, не так много на других платформах.

Также взгляните на эту статью , в которой рассматриваются некоторые проблемы с одиночными потоками, написанные Андреем Александреску. Его книга «Современный C ++ Design » также посвящена одноэлементным проблемам.

1 голос
/ 11 ноября 2009

Вы правы, вызов неконстантных методов или методов, которые зависят от данных экземпляра, которые могут быть изменены другими потоками, должен быть синхронизирован.

0 голосов
/ 11 ноября 2009

Помимо проблемы безопасности потока при инициализации переменной экземпляра, объекты-одиночки должны рассматриваться как любые другие нормальные объекты в отношении безопасности потока для вызовов метода.

т.е. любые методы (вам также необходима синхронизация для метода const, если мы пытаемся прочитать значение переменной, которая будет обновлена ​​в другом методе другим потоком) объекта-одиночки, к которому обращаются несколько потоков, и включает в общих данных чтение \ запись должны быть синхронизированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...