LINUX.ORG.RU

threads & pipe


0

0

Здравствуйте. Возможно ли повреждение данных, если в один пайп записывают несколько потоков одновременно? Или нужно обязательно мьютекс? Как я понимаю запись одного байта более менее атомарно, а строки в символов 30 ?

anonymous

Желательно конечно использовать мьютексы, причем весьма желательно. Плюс после записи каждым потоком своей порции данных желательно сбрасывать буфера.

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

Это пайп между несколькими тредами (для них он стдаут) и отдельным тредом, который делает на нем poll() и уже сам разбирается с данными. В этом случае все равно желательно? А на счет посылки одного char я был прав, что в этом случае мьютексы не нужны ?

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

Если за раз записывается не более чем PIPE_BUF байт, то запись с помощью write будет атомарна.

man 7 pipe

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

> Ок, в /usr/src/linux/include/linux/limits.h нашел, 4096 байтов мне хватит за глаза, спасибо !

Рассчитывать именно на 4096 байт непортабельно.
POSIX требует, чтобы PIPE_BUF был не менее 512 байт но не требует
ничего более. Это значение может отличаться от системы к системе,
даже (IMHO) между Linux'ами.
Более того, проверка во время компиляции макроса PIPE_BUF тебе ничего
не даст - на машине, где программа будет работать, значение PIPE_BUF
может быть совсем другое (а ты его уже вкомпилировал).

Так что AFAIK самый корректный метод - определение этого параметра
_во_время_выполнения_ при помощи pathconf(), опция _PC_PIPE_BUF.
(man 3 pathconf).

И вообще - читай Стивенса, в UNPv2 это описано с примерами
http://www.ozon.ru/context/detail/id/1011815/

HTH

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

Спасибо! ..тока е сейчас нет в наличии

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

P.S. ну если POSIX требует не менее 512 - то на 512 то можно рассчитывать на большинстве системах ? Мне и этого за глаза хватит

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

> P.S. ну если POSIX требует не менее 512 - то на 512 то можно рассчитывать на большинстве системах ?

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

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

> Думаю что да, по крайней мере 512 всегда должно быть.

Угу, в таких местах крайне полезно расставлять assert'ы.

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

> Угу, в таких местах крайне полезно расставлять assert'ы.

Ниасилил - как в "таком месте" поможет assert? И какой assert?

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