Взаимное исключение и сокеты C

Я поддерживаю существующую систему, в которой предыдущие разработчики каждой операции выполняются в сокете, для которого требуется несколько потоков для чтения и записи, предыдущие разработчики выполняли операции ввода-вывода под контролем и мьютексом. есть ли требование взаимно исключать операции ввода-вывода сокета C? Или, поскольку сокеты полнодуплексные, использование мьютекса излишне? Только один поток

Я не сомневаюсь, что очередь обработки, в которую поток помещает объект, является разделяемой памятью, и необходимо позаботиться о ее взаимном исключении.


person biosFF    schedule 18.05.2009    source источник


Ответы (2)


По умолчанию сокеты не являются потокобезопасными. Поэтому, если у вас есть несколько потоков, читающих и записывающих их, вам нужно будет каким-то образом заблокировать доступ (например, с помощью мьютекса).

person Matthew Murdoch    schedule 18.05.2009

в случае TCP (AF_INET, SOCK_STREAM) нормально иметь поток чтения (recv) и поток записи (отправка), которые не синхронизированы.

Но из вашего описания непонятно, с какой целью в вашем коде используется мьютекс - похоже "предыдущие разработчики" синхронизировали сетевые операции не из-за сокетов, а из-за требований протокола вашего приложения. Многие приложения осуществляют связь таким образом:

lock
-> send request
<- recv reply
unlock

lock
-> send request
<- recv reply
unlock

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

person Andrey    schedule 22.05.2009