Здравствуйте 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();
}