Почему моя пользовательская реализация очередей без блокировки в C ++ иногда теряет элементы под высоким параллелизмом, C++

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

Сообщение 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>

Подробнее здесь: https://stackoverflow.com/questions/797 ... lose-eleme
Ответить

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

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

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

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

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