одновременное чтение файловый дескриптор из двух потоков

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

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

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

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

5
задан Community 4 March 2011 в 09:19
поделиться