Я экспериментирую с очередью без блокировки в C ++ 17 для высокопроизводительной многопродуктивной многопонаси.#include
#include
#include
#include
struct Node {
int data;
std::atomic next;
Node(int d) : data(d), next(nullptr) {}
};
class LockFreeQueue {
std::atomic head;
std::atomic tail;
public:
LockFreeQueue() {
Node* dummy = new Node(0);
head.store(dummy);
tail.store(dummy);
}
void enqueue(int value) {
Node* node = new Node(value);
Node* oldTail;
while (true) {
oldTail = tail.load();
Node* next = oldTail->next.load();
if (next == nullptr) {
if (oldTail->next.compare_exchange_weak(next, node)) {
tail.compare_exchange_weak(oldTail, node);
return;
}
} else {
tail.compare_exchange_weak(oldTail, next);
}
}
}
bool dequeue(int &result) {
Node* oldHead;
while (true) {
oldHead = head.load();
Node* next = oldHead->next.load();
if (next == nullptr) return false;
if (head.compare_exchange_weak(oldHead, next)) {
result = next->data;
delete oldHead;
return true;
}
}
}
};
< /code>
При запуске с 4+ продюсерами и потребительскими потоками иногда: < /p>
Некоторые экологически чистые элементы никогда не появляются в потребителях. MEARY_ORDER_RELEASE/Приобретение), но поведение сохраняется. /> Иногда, некоторые значения, кажется, исчезают (никогда не отстранены), или система застряла в спин-петле, где производители продолжают повторять, но не достигнут прогресс. < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... lose-eleme
Почему моя пользовательская реализация очередей без блокировки в C ++ иногда теряет элементы под высоким параллелизмом, ⇐ C++
Программы на C++. Форум разработчиков
1758836351
Anonymous
Я экспериментирую с очередью без блокировки в C ++ 17 для высокопроизводительной многопродуктивной многопонаси.#include
#include
#include
#include
struct Node {
int data;
std::atomic next;
Node(int d) : data(d), next(nullptr) {}
};
class LockFreeQueue {
std::atomic head;
std::atomic tail;
public:
LockFreeQueue() {
Node* dummy = new Node(0);
head.store(dummy);
tail.store(dummy);
}
void enqueue(int value) {
Node* node = new Node(value);
Node* oldTail;
while (true) {
oldTail = tail.load();
Node* next = oldTail->next.load();
if (next == nullptr) {
if (oldTail->next.compare_exchange_weak(next, node)) {
tail.compare_exchange_weak(oldTail, node);
return;
}
} else {
tail.compare_exchange_weak(oldTail, next);
}
}
}
bool dequeue(int &result) {
Node* oldHead;
while (true) {
oldHead = head.load();
Node* next = oldHead->next.load();
if (next == nullptr) return false;
if (head.compare_exchange_weak(oldHead, next)) {
result = next->data;
delete oldHead;
return true;
}
}
}
};
< /code>
При запуске с 4+ продюсерами и потребительскими потоками иногда: < /p>
Некоторые экологически чистые элементы никогда не появляются в потребителях. MEARY_ORDER_RELEASE/Приобретение), но поведение сохраняется. /> Иногда, некоторые значения, кажется, исчезают (никогда не отстранены), или система застряла в спин-петле, где производители продолжают повторять, но не достигнут прогресс. < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79775326/why-does-my-custom-lock-free-queue-implementation-in-c-occasionally-lose-eleme[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия