Re[2]: ref_count strings & threads
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 15.05.02 12:44
Оценка:
Здравствуйте Sergey, Вы писали:

DG>>Из-за того, что const CString на самом деле не константый объект (у него модифицируется счетчик ссылок), все падает.


S>Так смотря как он модифицируется...


+1 в конструкторе/-1 в деструкторе, простым инкрементом

DG>>Как быть?


S>Это MFCшный CString или нет? Конкретнее, как у него подсчет ссылок реализован?

в данном случае WTL::CString,
InterlockedIncrement\InterlockedDecrement

DG>>На ум приходит, только одно решение, при возврате строки говорит CString-у, чтобы он делал копию, а не увеличивал счетчик.


S>Или, например, синхронизировать доступ к CString, или вообще возвращать из get_String возвращать const char *.


Синхроyизировать доступ не получается, т.к. уменьшение счетчика происходит не понятно где...


DG>>Более общий вопрос, как лучше писать код, которые использует константные объекты из нескольких thread-ов?

DG>>Получается, что для таких объектов вообще нельзя пользоваться ссылками, а можно только передавать объекты по значению.

S>Почему? Для настоящих константных объектов?


А что это такое?

В данном коде, Const — настоящий константный объект или не настоящий?
struct Const
{
  Const():p(new int()){*p = 0;}
  void Increment() const {*p++;}
  void Decrement() const {*p--;}
  ~Const(){delete p;}
  int * p;
};

const Const cnst;

void Thread ()
{
  cnst.Increment(); 
  cnst.Decrement();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.