Поточно-безопасный интеллектуальный указатель чтения-записи в C ++, x86-64

Я разрабатываю некоторую свободную от блокировок структуру данных, и возникает следующая проблема.

У меня есть поток записи, который создает объекты в куче и помещает их в интеллектуальный указатель со счетчиком ссылок. У меня также есть много читательских потоков, которые работают с этими объектами. Код может выглядеть так:

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 , это означает, по крайней мере,

  1. Прочитать адрес.
  2. Увеличить счетчик ссылок.

Я не могу выполнять эти две операции атомарно, поэтому иногда мои читатели работают с удаленным объектом.

Вопрос в том, какой тип интеллектуального указателя я должен использовать, чтобы сделать возможным доступ для чтения и записи из нескольких потоков с правильным управлением памятью? Решение должно существовать, поскольку Java-программисты даже не заботятся о такой проблеме, просто полагаясь на то, что все объекты являются ссылками и удаляются только тогда, когда их никто не использует.

Для PowerPC я нашел http://drdobbs.com/184401888 , выглядит неплохо, но использует инструкции с привязкой к загрузке и с условием сохранения, которых нет в x86.

Насколько я понимаю, указатели Boost предоставляют такую ​​функциональность только с использованием блокировок. Мне нужно безблокировочное решение.

5
задан Rizar 4 November 2011 в 09:30
поделиться