2015-04-17 3 views
1

У меня есть простая серверная программа, написанная на C на Debian с использованием pthread lib. Программа обрабатывает связь между некоторыми клиентами, которые хотят обмениваться файлами. Для каждого клиента есть поток обработчика. Теперь, в какой-то момент, каждый поток будет блокировать recv(), ожидающий любых запросов файла клиента. Если один из клиентов запрашивает конкретный файл, принадлежащий другому клиенту, сервер должен получить этот файл от своего владельца через поток обработчика, а затем доставить файл клиенту, который запросил его, через поток обработчика. Поскольку все потоки заблокированы при вызовах recv(), как их можно заметить другими потоками, они должны запросить файл для клиента, с которым они обращаются? Есть ли способ «прервать» recv(), выполнить запрос, а затем вернуться к recv()?Программирование Pthread сервера: как освободить поток, который заблокирован при вызове recv для обработки запроса из другого потока

+0

Имейте неблокирующие сокеты и используйте 'select' /' poll'? –

+0

К сожалению, одним из требований проекта является то, что потоки должны блокироваться на recv. Можно ли использовать сигнал SIGUSR1 для прерывания блокировки recv? – auserdude

+0

Сложная часть с потоками микширования и сигналами гарантирует, что сигнал будет отправлен в правильную нить. Неблокирующее recv() является лучшим решением, потому что поток, заблокированный внутри select(), может быть разбужен, посылая его байтом в другой сокет. Тем не менее, если вы должны попробовать маршрут сигналов, см. Это: http://stackoverflow.com/questions/2575106/posix-threads-and-signals –

ответ

2

Классический способ сделать это, чтобы создать pipe() для каждого потока, и вместо блокировки на recv() вызова, поток блокируется в poll() мониторинга как сокет и читать дескриптор конца файла трубы. Когда poll() вернется, если сокет читается, то вызовите recv(); если труба читается, тогда читайте ее и проверяйте запросы от других потоков.

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

 Смежные вопросы

  • Нет связанных вопросов^_^