Эта очередь MPSC (мультипроизводитель одиночная очередь потребителей) иногда продолжает ждать в потребительской стороне, хотя я использовал операции CAS. Я добавил операцию CAS для функции Enqueue . Поскольку я использую указатели в качестве данных, я использую nullptr в качестве статуса, чтобы выяснить, написаны ли данные или нет. Я кодирую и помещаю те же данные в 4 производителей, и после получения я храню их в хэштате, чтобы убедиться, что я получил все данные. < /P>
Эта очередь MPSC (мультипроизводитель одиночная очередь потребителей) иногда продолжает ждать в потребительской стороне, хотя я использовал операции CAS. Я добавил операцию CAS для функции Enqueue . Поскольку я использую указатели в качестве данных, я использую nullptr в качестве статуса, чтобы выяснить, написаны ли данные или нет. Я кодирую и помещаю те же данные в 4 производителей, и после получения я храню их в хэштате, чтобы убедиться, что я получил все данные. < /P> [code]#include #include #include #include #include
#define QUEUE_SIZE 20
std::atomic head {0}; std::atomic tail {0};
// Use an array of int pointers for storage std::atomic data[QUEUE_SIZE] = {};
if (next_tail == head.load(std::memory_order_seq_cst)) { return false; // queue is full } } while (!tail.compare_exchange_weak(current_tail, next_tail));
// Allocate memory for the value int* new_value = new int(value); // Attempt to store the value in the current tail slot data[current_tail].store(new_value, std::memory_order_seq_cst);
return true; }
int dequeue(int &value) { u_int current_head = head.load(std::memory_order_seq_cst); if (current_head == tail.load(std::memory_order_seq_cst)) { return -1; // queue is empty }
int* stored_value = data[current_head].exchange(nullptr, std::memory_order_seq_cst); if (stored_value == nullptr) { return -2; // not ready }
value = *stored_value; delete stored_value; // Free the allocated memory
Эта очередь MPSC (мультипроизводитель одиночная очередь потребителей) иногда продолжает ждать в потребительской стороне, хотя я использовал операции CAS. Я добавил операцию CAS для функции Enqueue . Поскольку я использую указатели в качестве данных,...
Службы Springcloud с nacos, службы поставщика работают нормально, когда я исправляю ошибки и перезапускаю потребительскую службу, я вижу журнал ошибок: «org.apache.dubbo.rpc.RpcException: не удалось вызвать метод $invoke в службе...
Службы Springcloud с nacos, службы поставщика работают нормально, когда я исправляю ошибки и перезапускаю потребительскую службу, я вижу журнал ошибок: «org.apache.dubbo.rpc.RpcException: не удалось вызвать метод $invoke в службе...
У меня есть незаблокированная очередь с одним потребителем и несколькими производителями (MPSCQueue) в сочетании с std::counting_semaphore для уведомления потребителя о появлении новых элементов в очереди. Потребитель использует dequeue() для...
У меня есть незаблокированная очередь с одним потребителем и несколькими производителями (MPSCQueue) в сочетании с std::counting_semaphore для уведомления потребителя о появлении новых элементов в очереди. Потребитель использует dequeue() для...