Я использую специальную библиотеку сетевого протокола. Эта библиотека построена на TCP/IP и предположительно используется для обмена высокочастотными сообщениями. Это неблокирующая библиотека и использует обратные вызовы как интерфейс для интеграции с вызывающим.
Я не эксперт по производительности, и поэтому я решил задать этот вопрос здесь. Пользовательская библиотека поставляется с определенным ограничением, описанным ниже:
"Callee не должен вызывать какой-либо из API библиотеки в контексте потока обратного вызова. Если они попытаются это сделать, поток будет зависание"
Единственный способ преодолеть ограничение API - это запустить другой поток, который обрабатывает сообщение и вызывает библиотеку для отправки ответа. Поток библиотеки и поток процессов будут иметь общую очередь, которая будет защищена мьютексом и использовать вызовы wait_notify()
для указания наличия сообщения.
Если я получаю 80 тыс. сообщений в секунду, то я бы помещал потоки в сон и часто их разбудил, выполняя переключатели контекста потока ~ 80 тыс. раз в секунду.
Кроме того, поскольку есть два потока, они не будут использовать буфер сообщений в кеше L1. Линия кэша, содержащая сообщение, сначала будет заполнена потоком библиотеки, а затем выведена и вытащена в кеш L1 потока процессов. Я что-то упустил или, возможно, дизайн библиотеки не предназначен для высокопроизводительных случаев использования?
Мои вопросы:
-
Я видел предупреждения типа "Не используйте этот API в контексте обратного вызова, поскольку он может вызвать блокировки". во многих библиотеках. Каковы общие варианты дизайна, которые вызывают такие конструктивные ограничения? Они могут использовать рекурсивные блокировки, если это простой вопрос одного потока, вызывающий блокировку несколько раз. Является ли это проблемой повторного участия и какие проблемы могут заставить владельца API сделать API без повторного входа?
-
Есть ли способ в приведенной выше модели проектирования, где поток библиотеки и поток процессов могут совместно использовать одно и то же ядро и, следовательно, совместно использовать строку кэша?
-
Насколько дорогим является volatile
sig_atomic_t
как механизм совместного использования данных между двумя потоками? -
Учитывая высокочастотный сценарий, какой легкий способ обмена информацией между двумя потоками?
Библиотека и мое приложение построены на С++ и Linux.