Атомная реализация навязчивых общих указателей, позволяющих строительству от другого разрушенногоC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Атомная реализация навязчивых общих указателей, позволяющих строительству от другого разрушенного

Сообщение Anonymous »

интрузивные общие указатели имеют некоторые преимущества по сравнению с классическими блоками управления общими указателями, поскольку они позволяют, насколько я понимаю, атомные, беззаботные одновременные операции с отдельным автором и несколькими читателями, с одним основным исключением: когда указатель сбрасывает, а Refcount достигает нуля, удаление буфера, он не может быть согласован, или не может быть согласован, или не может быть согласован, или не может быть согласован, или не может быть согласован, или не может быть согласован, или не может быть согласован, или не может быть согласован с неверным. Указатель) < /p>
Есть ли способ удалить это ограничение? < /p>
Вот предложенная, неверная реализация. < /p>
template
class TIntrusiveSharedPointer
{
public:
TIntrusiveSharedPointer() { AP.store(nullptr); }
~TIntrusiveSharedPointer() { Reset(); }

// Resets the reference
void Reset() noexcept
{
T* OldP = AP.exchange(nullptr, std::memory_order_acq_rel)
if(OldP && OldP->RefCount.fetch_sub(1, std::memory_order_acq_rel)==1)
{
delete OldP;
}
}

/* Copy constructor */
TIntrusiveSharedPointer(const TIntrusiveSharedPointer& Other)
{
while(true)
{
T* NewP = Other.AP.load(std::memory_order_consume);
if(!NewP)
{
AP.store(nullptr, std::memory_order_release);
return;
}
//We cannot safely read RefCount here, because even if we loaded
//A non zero NewP, RefCount might already have been decremented to 0
//And pointer destroyed
if(uint64 Count = NewP->RefCount.load(std::memory_order_acquire))
{
//Current RefCount is >=1, we can increment
if(NewP->RefCount.compare_exchange_weak (
Count, Count+1, std::memory_order_acquire))
{
AP.store(NewP, std::memory_order_release);
return;
}
}
else
{
//Current RefCount is zero, buffer about to be destroyed
AP.store(nullptr, std::memory_order_release);
return;
}
}
}

private:
std::atomic AP;
};
< /code>
tintrusivesharedpointer a; < /p>
void thread1 ()
{
a.reset();;br />} < /p>
void thread2 ()
{
/p> undefulded, если запустить согласованное, и бухто /> Tintrusivesharedpointer b (a);
} < /p>

Подробнее здесь: https://stackoverflow.com/questions/795 ... on-from-an
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»