интрузивные общие указатели имеют некоторые преимущества по сравнению с классическими блоками управления общими указателями, поскольку они позволяют, насколько я понимаю, атомные, беззаботные одновременные операции с отдельным автором и несколькими читателями, с одним основным исключением: когда указатель сбрасывает, а 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
Атомная реализация навязчивых общих указателей, позволяющих строительству от другого разрушенного ⇐ C++
Программы на C++. Форум разработчиков
1741968451
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79509612/atomic-implementation-of-intrusive-shared-pointers-allowing-construction-from-an[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия