одновременное чтение по файловому дескриптору из двух потоков - PullRequest
4 голосов
/ 20 февраля 2011
  1. мой вопрос : в Linux (и в FreeBsd, и вообще в UNIX) возможно / законно читать один файловый дескриптор одновременно из двух потоков?

  2. Я провел некоторый поиск, но ничего не нашел, хотя многие люди задают, например, вопрос о чтении / записи из / в сокет fd одновременно (имеется в виду чтение, когда другой поток пишет, а не чтение, когда другойчтение).Я также прочитал некоторые справочные страницы и не получил четкого ответа на свой вопрос.

  3. Почему я его спрашиваю.Я попытался реализовать простую программу, которая считает строки в stdin, например, wc -l.Я на самом деле тестировал мой самодельный движок C ++ io на издержки и обнаружил, что wc работает в 1,7 раза быстрее.Я урезал немного C ++ и приблизился к скорости wc, но не достиг ее.Затем я экспериментировал с размером входного буфера, оптимизировал его, но все же wc явно немного быстрее.Наконец я создал 2 потока, которые параллельно читают один и тот же STDIN_FILENO, и это, наконец, было быстрее, чем wc!Но количество строк стало неправильным ... так что я полагаю, что из-за операций чтения возникает нежелательная информация.Не волнует ли ядро, какой процесс читать?

Редактировать: Я провел некоторое исследование и обнаружил, что вызов read напрямую через syscall ничего не меняет.Код ядра, кажется, выполняет некоторую обработку синхронизации, но я не очень много понимаю (read_write.c)

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Это неопределенное поведение, посикс говорит:

Функция read () должна попытаться прочитать n-байтовые байты из файла, связанного с дескриптором открытого файла fildes, в буфер, на который указывает buf. Поведение нескольких одновременных чтений на одном канале, FIFO или терминальном устройстве не определено.

1 голос
/ 08 января 2013

При использовании с дескриптором (fd) read () и write () полагаются на внутреннее состояние fd, чтобы узнать «текущее смещение», при котором произойдет чтение и запись.В результате они не являются поточно-ориентированными.

Для обеспечения возможности одновременного использования одного дескриптора несколькими потоками предусмотрены pread () и pwrite ().В этих интерфейсах указывается дескриптор и желаемое смещение, поэтому «текущее смещение» в дескрипторе не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...