2013-02-20 6 views
0

Снова что-то о блокировке ...Использование QAtomicInt в качестве забора памяти

Предположим, что я реализую простой массив, основанный на круговом FIFO целых чисел. К FIFO обращаются 2-х ниточный производитель, один потребитель. Индексы чтения и записи всегда обновляются ПОСЛЕ доступа к элементу. На одном CPU это было бы безопасно (предполагая, что операция обновления индексов является атомарной), поскольку только один поток имеет доступ на запись к индексу. На машине SMP это может вызвать проблемы из-за того, что оба процессора могут видеть другое представление индекса из-за его кэша и переупорядочения.

QT имеет перекрестные платформенные атомные переменные, которые также реализуют забор памяти, будет ли использование QAtomicInt безопасным слиянием FIFO или я что-то упускаю?

ответ

1

Было бы безопасно, если остальная часть вашей реализации звучит.

Как вы упоминаете, QAtomicInt реализует memory fences, которые мешают инструкции повторного заказа, и это также обеспечивает соблюдение согласованности кэша между процессорами (на самом деле тайники x86 и x86_64 процессоров все когерентные в любом случае, хотя протокол когерентности может привести к стойлу трубопровода и уменьшайте производительность, если вы полагаетесь на нее в плотной петле).

 Смежные вопросы

  • Нет связанных вопросов^_^