powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с сокетами в Linux 2.6 является thread-safe?
11 сообщений из 11, страница 1 из 1
Работа с сокетами в Linux 2.6 является thread-safe?
    #38450856
Работа с сокетами в Linux 2.6 является thread-safe, т.е. write() и read() для одного и того же сокета можно делать из разных потоков и если можно, то это обеспечивается блокировками mutex/spin-lock или реализовано через lock-free?
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38450869
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Write() и read() это два совершенно разных процесса, их всегда можно было делать из разных
потоков. А вот можно ли одновременно из разных потоков делать send() в один и тот же сокет
- вопрос гораздо интереснее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38450874
Dimitry SibiryakovWrite() и read() это два совершенно разных процесса, их всегда можно было делать из разных
потоков. А вот можно ли одновременно из разных потоков делать send() в один и тот же сокет
- вопрос гораздо интереснее.

Да это тоже интересует, если кто знает?
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38450932
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 3.2.39 (думаю это относится и к 2.6.* и 3.*) при записи/чтении сокета производится эксклюзивная блокировка структур сокета с усыплением ждущего потока.
Т.е. в теории должно быть потокобезопасно для любых комбинаций: read/read read/write write/write.
Как оно на практике - не знаю, т.к. код сокетов обернут в обобщенный код реализующий дескрипторы, в котором могут быть свои заморочки (но думаю что нет).
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38451149
Anatoly MoskovskyВ 3.2.39 (думаю это относится и к 2.6.* и 3.*) при записи/чтении сокета производится эксклюзивная блокировка структур сокета с усыплением ждущего потока.
Т.е. в теории должно быть потокобезопасно для любых комбинаций: read/read read/write write/write.
Как оно на практике - не знаю, т.к. код сокетов обернут в обобщенный код реализующий дескрипторы, в котором могут быть свои заморочки ( но думаю что нет ).
В смысле, что нет заморочек или нет потокобезопасности? :)
Т.е. потокобезопасность именно lock-based и именно на мьютексе (не спинлок), а есть какие-то ссылки или цитаты из стандарта POSIX (POSIX.1-2001/SUSv3) на эту тему или хотя бы откуда это известно?
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38451165
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокеты в Linux thread-safe?В смысле, что нет заморочек или нет потокобезопасности? :)
Заморочек :)
Сокеты в Linux thread-safe?Т.е. потокобезопасность именно lock-based и именно на мьютексе (не спинлок), а есть какие-то ссылки или цитаты из стандарта POSIX (POSIX.1-2001/SUSv3) на эту тему или хотя бы откуда это известно?
Да, мьютекс. Из исходников ядра известно. :)
А как по стандарту - не в курсе.

Вообще, если бы не было потокобезопасности в сисколах, то юзерспейс мог бы легко повредить структуры ядра. Т.е. тут два варианта потокобезопасного поведения: либо параллельные вызовы сериализуются, либо выполняется только один из них, а остальные возвращают ошибку.
Какой из этих вариантов применяется для write/write - вы можете легко проверить экспериментом.
Но как я выше сказал, для сокетов (да, забыл сказать - я смотрел в код TCP-сокетов, для других протоколов может быть по другому) - идет сериализация в самом сокете, а вышележащий код, вплоть до верхнего уровня sys_write, скорее всего вообще ничего потоко-опасного не делает и не нуждается в доп. синхронизации.
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38451166
Anatoly MoskovskyСокеты в Linux thread-safe?В смысле, что нет заморочек или нет потокобезопасности? :)
Заморочек :)
Сокеты в Linux thread-safe?Т.е. потокобезопасность именно lock-based и именно на мьютексе (не спинлок), а есть какие-то ссылки или цитаты из стандарта POSIX (POSIX.1-2001/SUSv3) на эту тему или хотя бы откуда это известно?
Да, мьютекс. Из исходников ядра известно. :)
А как по стандарту - не в курсе.

Вообще, если бы не было потокобезопасности в сисколах, то юзерспейс мог бы легко повредить структуры ядра. Т.е. тут два варианта потокобезопасного поведения: либо параллельные вызовы сериализуются, либо выполняется только один из них, а остальные возвращают ошибку.
Какой из этих вариантов применяется для write/write - вы можете легко проверить экспериментом.
Но как я выше сказал, для сокетов (да, забыл сказать - я смотрел в код TCP-сокетов, для других протоколов может быть по другому) - идет сериализация в самом сокете, а вышележащий код, вплоть до верхнего уровня sys_write, скорее всего вообще ничего потоко-опасного не делает и не нуждается в доп. синхронизации.
Интересно, а почему они просто мьютекс поставили, а не допустим очередь защищенную мьютексом?
Ждать отправки то как бы не обязательно - кинули в очередь и пошли дальше выполнятся. И блокировка держалась бы намного меньше. Или там внутри все таки есть очередь?
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38451179
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокеты в Linux thread-safe?Интересно, а почему они просто мьютекс поставили, а не допустим очередь защищенную мьютексом?
Естественно там очередь. Даже по умолчанию работает алгоритм Нэйгла, при котором пакеты отправляются не сразу, а при определенных условиях.
Так что конечно же при захвате мьютекса речь не идет про ожидание физической отправки данных.
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38451277
Anatoly MoskovskyСокеты в Linux thread-safe?Интересно, а почему они просто мьютекс поставили, а не допустим очередь защищенную мьютексом?
Естественно там очередь. Даже по умолчанию работает алгоритм Нэйгла, при котором пакеты отправляются не сразу, а при определенных условиях.
Так что конечно же при захвате мьютекса речь не идет про ожидание физической отправки данных.
Т.е. в принципе сокеты можно использовать, как потоко-безопасную lock-based очередь (много производителей - много потребителей) для обмена данными между процессами, причем с возможностью дальнейшего разнесения процессов по разным серверам соединенным по сети?
Т.е. в одном процессе много потоков пишут в один и тот же сокет, а в другом процессе много потоков вычитывают данные из одного и того же сокета и таким образом получаем балансировку нагрузки.
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38453830
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сокеты в Linux thread-safe?,

Ну да.. Один процесс вычитает первую половину сообщения, а другой вторую половину сообщения :)
Также и с записью. :)

Не, так не работает..
...
Рейтинг: 0 / 0
Работа с сокетами в Linux 2.6 является thread-safe?
    #38453863
vromanovСокеты в Linux thread-safe?,

Ну да.. Один процесс вычитает первую половину сообщения, а другой вторую половину сообщения :)
Также и с записью. :)

Не, так не работает..
Ну сокеты по разным протоколам работают, например передача UDP-датаграмм - всегда получаются завершенные сообщения, или нет? :)

А с TCP я так понимаю придеться с обеих сторон по одному потоку работать с одним сокетом, и с обеих сторон понадобиться по потоко-безопасной очереди для работы множества потоков с этим сокетом?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с сокетами в Linux 2.6 является thread-safe?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]