Спин-ожидание C ++ 11 - PullRequest
       33

Спин-ожидание C ++ 11

1 голос
/ 29 апреля 2019

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

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 Ответ

4 голосов
/ 29 апреля 2019

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

...