Спин ждать 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. Такая очередь позволяет авторам добавлять новые записи данных, не блокируя устройства считывания, и программа чтения может получать данные максимально быстро, не блокируя средства записи. Таким образом, данные могут обрабатываться с максимальной скоростью, если они доступны и не потребляют ресурсы ЦП в противном случае.