Linux open () файловый дескриптор - PullRequest
1 голос
/ 09 сентября 2010

Если я несколько раз открою один и тот же файл (файл .txt) в разных потоках, возвращаемый дескриптор файла будет другим. Если бы я попытался написать () с помощью файлового дескриптора, был ли заблокирован какой-либо шанс функции записи, если несколько потоков пытались записать в один и тот же файл?

Меня беспокоит, когда поток вызывает запись в один файл, а другой поток вызывает запись в тот же файл. Так будет ли запись второго потока ждать, пока запись первого потока не закончится первой? Если это так, как я могу гарантировать, что второй вызов для записи не будет ждать и немедленно вернется, если будет первая запись, поскольку я не хочу, чтобы запись второго потока ожидала.

Спасибо

Ответы [ 4 ]

3 голосов
/ 09 сентября 2010

Нет, но последняя write() всегда будет сжимать более ранние записи, если они записывают в перекрывающиеся области файла.

Более распространенный вопрос касается смещения записи, что может быть вашим истинным вопросом. В этом случае ответ таков: нет, если вы звоните open() из каждого потока. Запись будет происходить при смещении файла, оставшемся от последнего write(), к любым дескрипторам, исходящим из того же самого исходного вызова open(), например, полученным с помощью dup () или совместно используемым потоками в том же процессе .

1 голос
/ 09 сентября 2010

Независимо от того, используете ли вы процессы или потоки, запись в один и тот же файл в одно и то же время может вызвать проблемы, если это не будет сделано очень тщательно.

Не имеет значения, является ли дескриптор файла тем же номером или нет.

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

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


Если вы хотите записать разные части одного и того же файла в несколько потоков, то вы можете использовать pwrite () для записи в определенное место в файле, и несколько потоков могут использовать один и тот же файл. дескриптор. Это нормально, если ваши темы делают правильные вещи.

Этот метод обычно не работает с текстовыми файлами. Обычно текстовые файлы должны записываться только одним потоком, чтобы получить предсказуемый контент.

1 голос
/ 09 сентября 2010

Если у вас есть несколько потоков, совместно использующих один и тот же ресурс (в вашем случае, файл), вы обязаны использовать какую-либо синхронизацию (например, семафор или мьютекс), чтобы гарантировать, что в любой момент выполняется только одна записьвремя.В противном случае результаты будут неопределенными.Unix не будет отслеживать это для вас - если вы начнете запись в одном потоке, когда запись в тот же файл выполняется в другом потоке, блокировка не произойдет.Операции записи будут завершены быстро, без каких-либо гарантий упорядочения операций ввода-вывода для базового физического устройства - они могут даже чередоваться.

0 голосов
/ 09 сентября 2010

Вы можете открыть файл в режиме записи (в этом случае запись может засорять друг друга), или вы можете открыть его в режиме добавления (в этом случае ОС блокирует и гарантирует, что каждая запись завершается атомарно, с последующей записью излюбой поток - направленный в новый конец файла).

Итак, используйте режим добавления.Ваш поток быстро сместит данные в очередь ядра (при условии, что вы сбрасываете), и вы продолжите работу.Если вы обнаружите, что это не достаточно быстро, вы можете попытаться переместить данные из вашего отдельного потока в поток, посвященный обновлению файлов, но сначала получите работающую систему с более простой и чистой реализацией, а не с профилем.

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