У меня следующая ситуация:Как настроить связь между двумя процессами?
Демон, который делает привилегированную операцию на данных, которые хранятся в памяти.
Многопоточный сервер в настоящее время работает на 30 ядрах, обрабатывающих запросы пользователей.
Сервер (1) будет получать запросы от (2), обрабатывать их один за другим и возвращать ответ. Каждый запрос к (1) никогда не будет блокироваться и будет обрабатывать только часть микросекунды (1) для обработки, поэтому мы гарантированно получим ответы назад, если только (1) не переполнится слишком большой нагрузкой.
По существу, я хотел бы настроить ситуацию, когда (1) прослушивает сокет домена UNIX и (2) записывает запросы и считывает ответы. Тем не менее, я хотел бы, чтобы каждый поток (2) мог читать и писать одновременно. Моя идея состоит в том, чтобы один сокет UNIX на поток для связи между (1) и (2) имел (1) блок в epoll_wait в этих запросах обработки сокетов один за другим. Каждый поток на (2) затем будет считывать и записывать независимо в его сокет.
Проблема, которую я вижу при таком подходе, заключается в том, что я не могу легко динамически увеличить количество потоков на (2). Есть ли способ сделать это таким образом, который является гибким в отношении конфигурации времени выполнения? Я предполагаю, что один подход состоял бы в том, чтобы иметь большое количество сокетов, а поток (2) выбирал один сокет случайным образом, брал на нем мьютекс, записывал запрос и блокировал ожидающий ответ, а затем отпускал мьютекс, когда он получает ответ от (1).
У кого-нибудь есть идеи?
К сожалению, не могли бы вы подробнее объяснить, в чем проблема с вашим собственным предложенным решением? Кажется вполне разумным, чтобы каждый поток (2) записывался в свой собственный сокет, как вы предлагаете, и (1) 'epoll_wait'ing на всех из них. – Smeeheey
Если вы говорите о датаграммах (похоже, что вы!) Вполне разумные решение состоит в том, чтобы несколько потоков прослушивали (и записывали) на ** то же ** сокет. Эта схема не требует никакой внешней синхронизации (для себя. Возможно, вам потребуется синхронизировать внешние данные, конечно). – SergeyA
@SergeyA: Я думаю, проблема с тем же сокетом заключается в чтении ответа, пытаясь выяснить, к какому потоку принадлежит ответ? – eof