Ich habe Kapitel 7 von C++ Concurrency in Action (2. Auflage) gelesen. Beim Testen der im Buch bereitgestellten Implementierung einer sperrenfreien Warteschlange habe ich gelegentlich eine Situation beobachtet, in der in der Warteschlange eingereihte Elemente verloren gingen. Unten ist die Implementierung der sperrenfreien Warteschlange:
Ich habe Kapitel 7 von C++ Concurrency in Action (2. Auflage) gelesen. Beim Testen der im Buch bereitgestellten Implementierung einer sperrenfreien Warteschlange habe ich gelegentlich eine Situation beobachtet, in der in der Warteschlange eingereihte Elemente verloren gingen. Unten ist die Implementierung der sperrenfreien Warteschlange: [code]template class lock_free_queue { private: struct node; struct counted_node_ptr { int external_count; node *ptr; uint8_t padding[sizeof(void *) - sizeof(int)]; };
std::unique_ptr pop() { counted_node_ptr old_head = _head.load(std::memory_order_relaxed); for (;;) { increase_external_count(_head, old_head); node *const ptr = old_head.ptr; if (ptr == _tail.load().ptr) { ptr->release_ref(); // return std::unique_ptr(); } counted_node_ptr next = ptr->next.load(); if (_head.compare_exchange_strong(old_head, next)) { T *const res = ptr->data.exchange(nullptr); free_external_counter(old_head); return std::unique_ptr(res); } ptr->release_ref(); } } }; [/code] Testcode [code]void t1_producer(lock_free_queue &queue, int start, int count) { for (int i = start; i < start + count; ++i) { queue.push(i); } }
void t1_consumer(lock_free_queue &queue, std::atomic &sum, int consume_count) { for (int i = 0; i < consume_count;) { auto value = queue.pop(); if (value) { sum += *value; ++i; } } }
int main() { for (int i = 0; i < 100; i++) { lock_free_queue queue; std::atomic sum(0);
int num_producers = 4; int num_consumers = 4; int items_per_producer = 1000;
std::vector producers; std::vector consumers;
for (int i = 0; i < num_producers; ++i) { producers.emplace_back(t1_producer, std::ref(queue), i * items_per_producer, items_per_producer); }
for (int i = 0; i < num_consumers; ++i) { consumers.emplace_back(t1_consumer, std::ref(queue), std::ref(sum), (num_producers * items_per_producer) / num_consumers); }
Ich führe einen Supervisor-Worker in einem Container als unabhängige Aufgabe in aws aus. Ich habe das Flag --stop-when-empty angegeben, aber die Aufgabe läuft weiter, auch wenn sich keine Nachrichten...
Ich möchte zunächst wissen, wie viele Nachrichten bereits in einer Warteschlange vorhanden sind. Der folgende Klassenbrowser gibt die Anzahl der in der Warteschlange vorhandenen Nachrichten zurück....
Problem beim Zugriff auf das Verzeichnis /var/www/todo-app auf einem Remote-VPS während der Bereitstellung
Ich verwende GitHub Actions, um meine Anwendung auf einem Remote-VPS bereitzustellen, und...