У меня возникла проблема с созданием кольцевого буфера фиксированного размера без блокировки.
У нас есть 2 обновления во время вставки или отправки.
Первое обновление — это обновление хвостового указателя.
Второе обновление — это обновление фактического местоположения данных.
Даже если мы получим правильное первое обновление, прежде чем мы выполним второе обновление, другой поток потенциально может обернуться и перезаписать местоположение.
Как я могу сделать и то, и другое без блокировки?
Подход с тегами позволяет избежать проблемы ABA, но позволяет решить проблему двух обновлений.
bool push(const T& item) {
TaggedHandle tail, next;
do {
tail = tail_.load();
next = tail.next();
if (next.index == head_.load().index) {
return false; // Buffer is full
}
} while (!tail_.compare_exchange_strong(tail, next));
buffer_[tail.index] = item; // This update can be corrupted if other threads wraps arounds and updates??
return true;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... fixed-size
Существует ли реальная реализация кольцевого буфера без блокировки фиксированного размера? ⇐ C++
Программы на C++. Форум разработчиков
1728956211
Anonymous
У меня возникла проблема с созданием кольцевого буфера фиксированного размера без блокировки.
У нас есть 2 обновления во время вставки или отправки.
Первое обновление — это обновление хвостового указателя.
Второе обновление — это обновление фактического местоположения данных.
Даже если мы получим правильное первое обновление, прежде чем мы выполним второе обновление, другой поток потенциально может обернуться и перезаписать местоположение.
Как я могу сделать и то, и другое без блокировки?
Подход с тегами позволяет избежать проблемы ABA, но позволяет решить проблему двух обновлений.
bool push(const T& item) {
TaggedHandle tail, next;
do {
tail = tail_.load();
next = tail.next();
if (next.index == head_.load().index) {
return false; // Buffer is full
}
} while (!tail_.compare_exchange_strong(tail, next));
buffer_[tail.index] = item; // This update can be corrupted if other threads wraps arounds and updates??
return true;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79088159/is-there-a-true-implementation-of-lock-free-ring-buffer-with-fixed-size[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия