Я работаю над реализацией стека без блокировок с использованием C++ и CAS (compare_exchange_strong/compare_exchange_weak). Кажется, что реализация работает нормально в современных системах Linux, но не работает в Windows и некоторых старых версиях Linux. Ниже приведен полный код для тестирования безопасности потоков с участием нескольких производителей и потребителей:
Я работаю над реализацией стека без блокировок с использованием C++ и CAS (compare_exchange_strong/compare_exchange_weak). Кажется, что реализация работает нормально в современных системах Linux, но не работает в Windows и некоторых старых версиях Linux. Ниже приведен полный код для тестирования безопасности потоков с участием нескольких производителей и потребителей: [code]#include #include #include #include #include #include #include
#include #include #include using namespace std;
template class LockFreeStack { public: struct Node { T data; Node* next; Node(const T& value) : data(value), next(nullptr) {} };
LockFreeStack() : head(nullptr) {} ~LockFreeStack() { while (pop()); }
bool empty() { return head == nullptr; }
void push(const T& value) { Node* new_node = new Node(value); auto q = head.load(memory_order_relaxed);
do { new_node->next = q; } while (!head.compare_exchange_strong(q, new_node)); // Neither compare_exchange_strong nor compare_exchange_weak can guarantee thread safety. }
Node* pop() { auto q = head.load(memory_order_acquire); while (q && !head.compare_exchange_strong(q, q->next)) {} return q; }