Как я создаю незапертую очередь?

модуль Devel функция "Theme developer" удобна для наблюдения, какие шаблонные файлы Drupal ищет, когда это переходит к теме что-то. См. снимок экрана на той странице для примера.

15
задан Goz 12 November 2009 в 20:11
поделиться

5 ответов

Вы, вероятно, могли бы реализовать очередь ограниченного размера с наименьшими трудностями ... Я думал об этом недавно и придумал этот дизайн, но вы, вероятно, можете найти много других интересных идей: (ПРЕДУПРЕЖДЕНИЕ : могут возникнуть проблемы!)

  • очередь - это массив указателей на элементы
  • , которые вы должны управлять двумя указателями (голова, хвост), которые работают с очередью так же, как кольцевой буфер
  • if head == tail , нет элементов
  • , если вы хотите поставить в очередь (ptr) , Interlocked-Swap tail с NULL ( prev_tail - значение подкачки)
    • if prev_tail == NULL , попробуйте еще раз
    • if prev_tail + 1 (с переносом) == head , ваша очередь заполнена
    • в противном случае поместите ptr в * prev_tail и назначьте prev_tail + 1 на tail (следите за переносом буфера)
  • для dequeue () сделайте копию tmp_head = head и проверьте tmp_head == tail
    • , если это правда, верните, потому что очередь пуста
    • , если это false
      • сохранить * tmp_head как ptr
      • выполнить CAS: сравнить head с tmp_head поменять местами head на head + 1
      • , если CAS не удалось - запустить всю функцию с
      • , если это удалось - вернуть ptr

Вы можете ждать как головные, так и конечные операции CAS, но если очередь не оспаривается, вы должны добиться успеха с первого раза, без лишних блокировок.

Очереди неограниченного размера «немного» сложнее;) Но вы сможете создать достаточно большую очередь для большинства нужд.

11
ответ дан 1 December 2019 в 03:43
поделиться

Думаю, есть интересное обсуждение этой темы здесь , особенно в этой ветке.

3
ответ дан 1 December 2019 в 03:43
поделиться

У этих ребят есть, может, вы найдете там вдохновение. Другие интересные файлы - это yqueue.hpp и atomic_ptr.hpp

2
ответ дан 1 December 2019 в 03:43
поделиться

Решение Viraptor блокируется, нет нескольких производителей / множественных потребительских бессоленых очередь алготих, я знаю.

1
ответ дан 1 December 2019 в 03:43
поделиться

Возможно, вам стоит взглянуть на реализацию Herb Sutters очереди с низкой блокировкой.

http://www.drdobbs.com/hpc-high-performance-computing/211601363

Он действительно использует атомарность c ++ 0x, но это будет (должно быть) легко реализовать с вашей конкретной архитектурой атомарной ops (__sync_ * с использованием GNU, atomic_ * в Solaris и т. д.).

3
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: