LINUX.ORG.RU

Epoll + send и многопоточность

 , ,


0

1

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

TCP или UDP? Если последовательность передаваемых данных не имеет значения, то можно в принципе

Harald ★★★★★
()
Ответ на: комментарий от Harald

-

tcp. последоватнльность пакетов не важна, но самое главное, чтобы байты пакета не перепутались. можно будет так?

Vadimik
() автор топика
Ответ на: - от Vadimik

TCP - поточный протокол, как его разбивать на пакеты, решает система, байты таки могут перепутаться

Harald ★★★★★
()
Ответ на: - от Vadimik

tcp. последоватнльность пакетов не важна, но самое главное, чтобы байты пакета не перепутались.

Смотря сколько слать за один send().

Sorcerer ★★★★★
()

send() это атомарный и thread safe вызов. Вопрос в том, как эти данные потом будут обработаны на клиенте ?

joy4eg ★★★★★
()
Ответ на: - от Vadimik

наверное второе

Harald ★★★★★
()

вообще лучше подумать на тему, зачем разным потокам писать в один и тот же сокет?

Harald ★★★★★
()
Ответ на: комментарий от joy4eg

Если последовательность не важна, а важны сами «пакеты», то можно спокойно использовать send() на один fd из разных потоков.

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

Если последовательность не важна, а важны сами «пакеты», то можно спокойно использовать send() на один fd из разных потоков.

Это не так. Всё зависит от количества передаваемых за один send() данных. При этом стандарт не оговаривает минимальное гарантированное количество для сокетов. В линуксе это значение, вроде бы, то же, то и для pipe'ов, т.е. PIPE_BUF (4096).

Sorcerer ★★★★★
()
Ответ на: комментарий от joy4eg

На сколько я помню. Проблема в том, что нет гарантии, что send() примет все данные буфера. Он примет столько сколько захочет, и вернёт количество принятых к отправке байт.

surefire ★★★
()
Ответ на: комментарий от joy4eg

-

да. Пакет обычный из заголовка, в котором размер пакета, и тела. понятно, что если байты перепутаются, то нет смысла. Отправляю send'ом целый пакет.

Vadimik
() автор топика
Ответ на: комментарий от surefire

Да, верно, есть такой момент.
POSIX.1-2001/SUSv3 requires accept(), bind(), connect(), listen(),
socket(), send(), recv(), etc. to be thread-safe functions.
Уже ж было тут Are BSD sockets thread-safe?

joy4eg ★★★★★
()
Ответ на: - от Vadimik

Вот и получается.
Отправив в send() целый пакет, нужно контролировать, что бы он действительно влез целиком и докидывать остаток, если это не так.
И именно в этот момент нужна потоко-безопастность, так как 2 потока могут затолкать по пол пакета.

surefire ★★★
()
Ответ на: комментарий от surefire

Наверно можно, system depends. Да проверь и скажи о результе.

kdev
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.