LINUX.ORG.RU

Запись в один сокет из нескольких потоков


0

0

Господа...

Безопасно ли писать из двух потоков в один сокет?

Насколько я знаю, если во время выполнения блокирующего системного вызова (например write) приходит сигнал, прерывающий данный системный вызов, то, если установить параметр сокета SA_RESTART, системный вызов будет перезапущен. Если же этот параметр сокета не установлен, то write вернет количество байт, которое он успел записать.

Так вот вопрос: если у меня вызов write для сокета с флагом SA_RESTART прервется пришедшим сигналом, то есть ли вероятность того, что до того, как система перезапустит его, управление перехватит другой поток, который тоже пишет в этот сокет, и, соответственно, последовательность отсылаемых данных будет нарушена?

anonymous

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

Конечно!

Только я не совсем понимаю, как ты вообще собираешься разруливать райсы: если две нитки пишут в один сокет, то они будут перебивать друг друга случайным образом после каждой порцайки в PIPE_BUF (вроде, 4096 байт на Линуксе).

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

Ок. Большое спасибо за помощь.

anonymous
()

> Безопасно ли писать из двух потоков в один сокет?
В некоторых случаях лучше открыть 2 сокета, если потоки независимые - то при отсутствии синхронизации будет буст по первоменсу.

stpg
()
Ответ на: комментарий от anonymous

> Mutex на "очередь"

Не нужен, если FIFO, а читатель один (а no-dashi упомянул про "нить обработчика очереди"), правда требуется атомарный инкремент, что обычно мутексом реализовывается:-) К тому же спать на чем-то придется, и самое безобидное -- семафор, а мутекс просто вариант семафора.

Но в условии задачи звучало про одновременную запись в один сокет двумя нитками, что противоречит "нити обработчика очереди".

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