Использование QAtomicInt в качестве ограждения памяти

Опять что-то про блокировку бесплатно …

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

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

0

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]