Спин ждать C++11

У меня есть следующая структура

struct info {
 unsigned long a;
 unsigned long b;
};

atomic <info> data;

используется потоком писателя и потоком читателя. Читатель должен как можно быстрее реагировать на новые значения. Для этого я реализовал в читателе следующее:

while (true) {
  auto value = data.load();
  // do some operations given these new values
}

Эта операция очень интенсивно использует процессор. Я выбрал этот метод, потому что считаю, что он быстрее, чем, например, использование условной переменной и ожидание пробуждения потока считывателя при изменении данных. Кроме того, данные обновляются довольно часто, сотни раз в секунду. Есть ли лучший способ сделать это, оставаясь при этом самым быстрым временем реакции?

1 ответ

Семафор действительно является хорошим вариантом, позволяющим писателю сигнализировать о новых данных, а читатель просыпается, когда данные готовы к использованию. Однако для сценариев с высокой производительностью вы должны рассмотреть очередь без блокировки, например, написанную Moody Camel. Такая очередь позволяет авторам добавлять новые записи данных, не блокируя устройства считывания, и программа чтения может получать данные максимально быстро, не блокируя средства записи. Таким образом, данные могут обрабатываться с максимальной скоростью, если они доступны и не потребляют ресурсы ЦП в противном случае.

Другие вопросы по тегам