Как работать с разделяемой памятью в многопоточной среде? - PullRequest
0 голосов
/ 11 марта 2020

У меня модель клиент-сервер. Многопоточный клиент отправляет сообщение на сервер через сокеты TCP. Сервер также является многопоточным, каждый запрос обрабатывается потоком из рабочего пула.

Теперь сервер должен отправить сообщение клиенту через IP-адрес общей памяти C. Например:

multi threaded client --- GET /a.png --> server
                                          |
                                          |
                                       one worker
                                          |
                                          |
                                         \ /
                       puts the file descriptor into the shared memory  

Когда рабочий поток добавляет информацию в разделяемую память, как мне убедиться, что она прочитана тем же клиентом, который ее запросил?

Я чувствую себя здесь невежественным относительно того, как продолжить. В настоящее время я создал один сегмент разделяемой памяти, и на сервере 20 потоков, а на клиенте 10 потоков.

1 Ответ

0 голосов
/ 11 марта 2020

Хотя вы можете использовать IP C между потоками, обычно это не очень хорошая идея. Потоки в любом случае совместно используют всю память, поскольку они являются частью одного и того же процесса, и существуют очень эффективные механизмы для обмена данными между потоками.

Может быть, проще, когда один и тот же поток обрабатывает запрос на протяжении всего процесса. Таким образом, вам не нужно передавать запрос от потока к потоку. Однако, если у вас есть пул запросов, над которыми ведется работа, часто имеет смысл иметь поток, который может «отбросить» запрос, а затем впоследствии сможет заставить этот поток или другой поток «подхватить» request.

Самый простой способ сделать это - поместить всю информацию, относящуюся к запросу, в единую структуру или объект. Используйте стандартные инструменты синхронизации потоков (например, мьютексы) для управления поиском объекта, владения им и т. Д.

Поэтому, когда поток ввода-вывода получает запрос, он создает новый объект запроса, получает mutex и добавляет его в глобальную коллекцию запросов, над которыми работает сервер. Рабочие потоки могут проверить эту глобальную коллекцию, чтобы увидеть, какие запросы должны работать, или они могут быть явно отправлены потоком, который создал запрос.

...