Замена буферов без блокировок у одного производителя и нескольких потребителей

У нас есть случай, когда данные будут обновляться через регулярные промежутки времени. Но будет несколько потоков, читающих данные. Таким образом, решение, которое мы думаем, заключается в использовании двойных буферов. Таким образом, потребительские потоки будут читать переднюю страницу, а производитель обновит фоновую страницу. Как только производитель обновит фоновую страницу, он поменяет страницу переднего плана на эту страницу без взятия блокировки. Поскольку данные будут одинаковыми или разными, нам все равно, поскольку это не повлияет на работу.
Теперь вопрос состоит в том, как выполнить работу, поскольку я знаю традиционную проблему потребителя-производителя, где я могу использовать два буфера для одной и той же работы и продолжать вращать вещи, но проблема, чтобы поменять местами, мне нужна блокировка, но это то, что мы хотим избежать.

Так как выполнять вещи. Любой указатель на этот счет будет отличным.

0

Решение

Технически фактический обмен может быть выполнен:

  • C ++ 11 атомарных функций — например, std::atomic_echange, std::atomic_exchange_explicit
  • встроенная сборка — например, Intel lock xchg
  • Встроенные функции GCC — __atomic_exchange или старше __sync_lock_test_and_set
  • Функции MSVC — InterlockedExchangePointer
1

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

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

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