Безопасна ли открытая нить? - PullRequest
3 голосов
/ 27 марта 2011

Это нормально, если два потока вызывают open () одновременно? Как найти ответ на этот вопрос?

Предположим, что вызовы работают с разными файлами, и их флаги могут быть O_RDONLY, O_WRONLY или обоими.

Ответы [ 4 ]

5 голосов
/ 28 марта 2011

Это зависит от операционной системы и библиотеки времени выполнения C.Если он совместим с POSIX.1-2001 или POSIX.1-2008, то он должен быть потокобезопасным, как показано здесь: http://www.kernel.org/doc/man-pages/online/pages/man7/pthreads.7.html

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

2 голосов
/ 28 марта 2011

Поскольку вы заметили, что это разные файлы, проблем нет.

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

Редактировать: Было бы справедливо отметить, как Гай отмечает ниже в комментариях, что это не всегда так. Это зависит от того, является ли используемый вами libc потокобезопасным. Современные воплощения относятся к open() зову.

1 голос
/ 28 марта 2011

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

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

Возможно, что очень старый и скрипучийБиблиотека C может предоставлять не поточно-безопасный open (), но вряд ли вы столкнетесь с этим.Особенно, если вы используете потоки POSIX.

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

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

...