2016-12-06 3 views
0

Я занимаюсь задачей прослушивания веб-сервиса. Который отправит xml-данные через push-службу. Данные должны пройти некоторый расчет, а затем отобразиться.Очередь с блокировкой против Lock Free Queue

Я планировал использовать очередь для хранения данных службой прослушивания и считывать данные по коду бизнес-логики. Это чистая одиночная очередь одного производителя.

Поскольку я должен получать данные в виде нажатия на веб-службу, я должен всегда открывать, чтобы получать данные и вставлять их в очередь. Я думал об использовании boost_lockfree_spsc_queue. Поскольку, если это была блокируемая очередь, слушатель должен был ждать некоторое время, чтобы получить блокировку, в отличие от него boost_lockfree_spsc_queue не нуждается в каких-либо замках.

Данные, которые я буду хранить это

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

И очередь

boost::lockfree::spsc_queue<MemoryStruct*> lockFreeQ{100}; 

После прочтения раздела производительности здесь я немного запутался.

Безопасно использовать этот boost_lockfree_spcc_queue для производственных целей. Или я должен использовать стандартную очередь (C++ 11) с блокировками?

Thanks

+1

Да, это безопасно для производственных целей - если вы соблюдаете требования к использованию. Какой раздел вас смутил? – sehe

+0

Вы используете этот 'MemoryStruct', но беспокоитесь, что' boost' испортит вашу программу? – nwp

+0

Есть ли что-то не так с использованием MemoryStruct? – Kid

ответ

2

Да. Если вы ожидаете, что загрузка не насытит ваш процессор, вы просто столкнетесь с расходом электроэнергии. Обычный подход - экспоненциальный откат. ¹

Если вы совсем не уверены в этом, это сильно пахнет, как преждевременная оптимизация, и вы, вероятно, можете использовать очередь блокировки.

Вы можете убедиться, что ваши шаблоны использования позволяют легко менять их в режиме блокировки. Сделайте свою собственную блокировку pop(), которая завершит логику ожидания в случае реализации без блокировки.

¹ см., Например, http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack

+0

Прошу прощения. Я все еще не понимаю, что вы думаете о своей собственной функции блокировки pop(), которая завершала бы логику ожидания в случае блокировки -бесплатная реализация. " – Kid

+0

Создание собственного бронирования pop() означает объемный pop() с помощью lock() и unlock(). Что подразумевается под оболочкой ожидания логики без блокировки? блокировка бесплатно означает, Тогда почему я должен деформировать блокировку с использованием логики ожидания? – Kid

+0

TL; DR использует очередь блокировки. При желании, поиграйте со свободными очередями, чтобы вы увидели разницу в интерфейсе (например, не было никаких 'size()' или 'empty()' вызовов). Это упростит вам переход к незанятой очереди в будущей версии, если вы узнаете, что вам нужно это в конце концов. Только один шаг за раз.Посмотрите на то, что вы понимаете, расширяйте свои знания - шаг за шагом - следуйте своему любопытству. Выполнение прыжков просто приводит к дырам в вашем опыте/понимании. – sehe