pread
сам по себе является потокобезопасным, поскольку его нет в списке небезопасных функций . Так что это безопасно называть.
Реальный вопрос: что произойдет, если вы читаете из одного и того же файла одновременно (не обязательно из двух потоков, но также из двух процессов).
В связи с этим, спецификация гласит:
Поведение нескольких одновременных операций чтения на одном канале, FIFO или терминальном устройстве не определено.
Обратите внимание, что в нем не упоминаются обычные файлы. В любом случае этот бит относится только к read
, поскольку pread
нельзя использовать для файлов, которые нельзя найти.
Ввод / вывод должен быть атомарным по отношению к обычным файлам, каналам и FIFO.
Но это из ненормативного раздела, поэтому ваша ОС может сделать это по-другому. Например, если вы читаете из двух потоков и происходит одновременная запись, вы можете получить разные части записи в двух буферах чтения. Но проблема такого рода не относится к многопоточности.
Также приятно знать, что в некоторых случаях
read () блокирует вызывающий поток
Не процесс, а поток. И
Поток, который заблокирован, не должен препятствовать прогрессу [...] любого разблокированного потока в конечном итоге