Взаимное исключение и розетки C - PullRequest
0 голосов
/ 18 мая 2009

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

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

Ответы [ 2 ]

1 голос
/ 18 мая 2009

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

0 голосов
/ 22 мая 2009

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

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

lock
-> send request
<- recv reply
unlock

lock
-> send request
<- recv reply
unlock

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

...