Я читал главу 7 книги C++ Concurrency в действии (2-е издание). Во время тестирования реализации очереди без блокировки, представленной в книге, я иногда наблюдал ситуацию, когда элементы, поставленные в очередь, терялись. Ниже представлена реализация очереди без блокировки:
Я читал главу 7 книги C++ Concurrency в действии (2-е издание). Во время тестирования реализации очереди без блокировки, представленной в книге, я иногда наблюдал ситуацию, когда элементы, поставленные в очередь, терялись. Ниже представлена реализация очереди без блокировки: [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] Тестовый код [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); }
Как приложение может защититься от «использования-fast-free» или «двойного свободного», не требуя переписывания приложения? Тем не менее, он обеспечивает проверяемую защиту как от двойного, так и без пользователя без пользователя. Использование...
Я читал «C++ Concurrency In Action (2-е издание)» Энтони Уильямса. В главе 8, листинг кода 8.1 на стр. 855, приведен пример кода для параллельной реализации быстрой сортировки. Мне интересно, содержит ли этот код ошибку, в частности, в том, что член...
Как передать значение переменной класса Action в другой класс Action в Struts 2?
Я хочу использовать это значение переменной для запроса в другом действии class.
По логике, я использовал три свойства в классе LoginAction: электронная почта, имя...
intent.action == android.app.action.profile_provisioning_complete не стрельба
Но Onceive называется
Я пытался войти В приемнике profile_provisioning_complete , но он работает
mydeviceadminreceiver.ktобразной div class = snippet-code >
//...