Здравствуйте DarkGray, Вы писали:
DG>Столкнулся на днях с такой проблемой:
DG>Есть следующий код (немного упрощенный):
DG>DG>//Константная строка
DG>static const CString get_String()
DG>{
DG> static const CString str = MakeString(); //где MakeString довольно ресурсоемкая функция,
DG> // которую не хочется вызывать каждый раз
DG> return str;
DG>}
DG>//несколько Thread-ов, которые этой строкой пользуются:
DG>void Thread()
DG>{
DG> for (;;)
DG> {
DG> log.AddMessage (get_String());
DG> }
DG>}
DG>
DG>Из-за того, что const CString на самом деле не константый объект (у него модифицируется счетчик ссылок), все падает.
Так смотря как он модифицируется...
DG>Как быть?
Это MFCшный CString или нет? Конкретнее, как у него подсчет ссылок реализован?
DG>На ум приходит, только одно решение, при возврате строки говорит CString-у, чтобы он делал копию, а не увеличивал счетчик.
Или, например, синхронизировать доступ к CString, или вообще возвращать из get_String возвращать const char *.
DG>Но это тоже не выход, т.к. строка может быть до нескольких килобайтов, а функция дергается довольно часто.
DG>Более общий вопрос, как лучше писать код, которые использует константные объекты из нескольких thread-ов?
DG>Получается, что для таких объектов вообще нельзя пользоваться ссылками, а можно только передавать объекты по значению.
Почему? Для настоящих константных объектов?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.