Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.200.136] |
|
Сообщ.
#1
,
|
|
|
Доброй ночи.
Один сокет, одно соединение между клиентом и сервером. В приложении несколько потоков, которые могут в любой момент отправлять данные через SendTo() либо Send() (сокет - глобальная переменная). Можно ли это делать из разных потоков, ставит ли winsock эти вызовы в очередь либо там нужны критические секции и их отсутствие может быть причиной вылета приложения? |
Сообщ.
#2
,
|
|
|
Разумеется, в winsock все схвачено. Другое дело, что сокет может быть блокируемым или неблокируемым. В случае неблокируемого сокета одновременный многопоточный send может привести к мешанине переданных данных из разных потоков, но непосредственно к вылету приложения это привести не может (т.к. непосредственная запись порций данных в буфер winsock по любому синхронизирована).
Если же работа с сокетом производится не через АПИ, а через дельфийские классы-обертки, то в принципе возможны и серьезные конфликты, если коряво написаны обработчики событий типа OnSend и т.п. |
Сообщ.
#3
,
|
|
|
Голое API, Indy не признаю.
Мешанина не помешает, вопрос был только в возможности одновременного вызова send или sendto на один сокет из разных потоков. Обратно данные получает и обрабатывает отдельный поток, порядок не важен главное содержание. У меня несколько участков кода которые возможно требуют критической секции, кто-то из них дает редкие сбои. Код писал два года назад потому разбираюсь по сути заново. Значит, можно. |