Re: ref_count strings & threads
От: Sergey Россия  
Дата: 15.05.02 12:15
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.