Я разрабатываю некоторую свободную от блокировок структуру данных, и возникает следующая проблема.
У меня есть поток записи, который создает объекты в куче и помещает их в интеллектуальный указатель со счетчиком ссылок. У меня также есть много читательских потоков, которые работают с этими объектами. Код может выглядеть так:
SmartPtr ptr;
class Reader : public Thread {
virtual void Run {
for (;;) {
SmartPtr local(ptr);
// do smth
}
}
};
class Writer : public Thread {
virtual void Run {
for (;;) {
SmartPtr newPtr(new Object);
ptr = newPtr;
}
}
};
int main() {
Pool* pool = SystemThreadPool();
pool->Run(new Reader());
pool->Run(new Writer());
for (;;) // wait for crash :(
}
Когда я создаю локальную для потока копию ptr
, это означает, по крайней мере,
Я не могу выполнять эти две операции атомарно, поэтому иногда мои читатели работают с удаленным объектом.
Вопрос в том, какой тип интеллектуального указателя я должен использовать, чтобы сделать возможным доступ для чтения и записи из нескольких потоков с правильным управлением памятью? Решение должно существовать, поскольку Java-программисты даже не заботятся о такой проблеме, просто полагаясь на то, что все объекты являются ссылками и удаляются только тогда, когда их никто не использует.
Для PowerPC я нашел http://drdobbs.com/184401888 , выглядит неплохо, но использует инструкции с привязкой к загрузке и с условием сохранения, которых нет в x86.
Насколько я понимаю, указатели Boost предоставляют такую функциональность только с использованием блокировок. Мне нужно безблокировочное решение.