pread; потокобезопасен или нет? - PullRequest
5 голосов
/ 01 марта 2011

Есть ли проблема с использованием pread для одного и того же файлового дескриптора из 2 или более разных потоков одновременно?

Ответы [ 3 ]

8 голосов
/ 01 марта 2011

pread сам по себе является потокобезопасным, поскольку его нет в списке небезопасных функций . Так что это безопасно называть.

Реальный вопрос: что произойдет, если вы читаете из одного и того же файла одновременно (не обязательно из двух потоков, но также из двух процессов).

В связи с этим, спецификация гласит:

  • Поведение нескольких одновременных операций чтения на одном канале, FIFO или терминальном устройстве не определено.

    Обратите внимание, что в нем не упоминаются обычные файлы. В любом случае этот бит относится только к read, поскольку pread нельзя использовать для файлов, которые нельзя найти.

  • Ввод / вывод должен быть атомарным по отношению к обычным файлам, каналам и FIFO.

    Но это из ненормативного раздела, поэтому ваша ОС может сделать это по-другому. Например, если вы читаете из двух потоков и происходит одновременная запись, вы можете получить разные части записи в двух буферах чтения. Но проблема такого рода не относится к многопоточности.

Также приятно знать, что в некоторых случаях

read () блокирует вызывающий поток

Не процесс, а поток. И

Поток, который заблокирован, не должен препятствовать прогрессу [...] любого разблокированного потока в конечном итоге

0 голосов
/ 01 марта 2011

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

http://linux.die.net/man/2/pread

0 голосов
/ 01 марта 2011

Я не уверен на 100%, но я думаю, что сама структура файлового дескриптора не является поточно-ориентированной, поэтому два одновременных изменения ее повредят.Вам нужен какой-то замок.

...