Является ли std :: ifstream поточно-безопасным и без блокировки? - PullRequest
3 голосов
/ 02 мая 2010

Я намереваюсь выполнить открытие для чтения одного файла из многих потоков, используя std :: ifstream. Меня беспокоит, является ли std :: ifstream поточно-безопасным и без блокировки?

Подробнее:

  1. Я использую g ++ 4.4 на Ubuntu и Windows XP, 4.0 на Leopard.
  2. Каждый поток создает свой собственный экземпляр std :: ifstream

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 02 мая 2010

То есть реализация определена. Стандартный C ++ абсолютно ничего не говорит о многопоточности, и поэтому любые предположения о потоках по своей природе вызывают неуказанное или определяемое реализацией поведение.

Нам нужна более конкретная платформа, которую вы используете, но, вероятно, нецелесообразно предполагать, является ли поток потокобезопасным или свободным от блокировок. Если ничего другого, то, вероятно, в вызовах уровня ОС участвуют блокировки, которые фактически выполняют чтение из файла, и в этом случае настоящая реализация без блокировок невозможна. Даже без этого каждое чтение из потока if должно проверять несколько флагов формата и обновлять биты флагов в зависимости от того, что происходит во время чтения. (т. е. istream::good() и istream::operator bool) Так как все это не может быть выполнено атомарно, нецелесообразно много полагаться на характеристики безопасности потоков istream.

2 голосов
/ 02 мая 2010

См. http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html.

На момент написания этой страницы руководства стандартная библиотека GCC откладывалась на буферизацию файла C stdio операционной системы. Они избегают сохранения состояния вне структуры C FILE и благодаря этому достигают некоторого уровня безопасности.

Поскольку библиотека C stdio реализует буфер одного диапазона в файле вокруг последней операции ввода-вывода, я не вижу возможности реализации без блокировки . Операции над файлом должны обрабатываться последовательно. Возможно небуферизованный режим мог бы помочь; это немного больше исследований, чем я хотел бы сделать прямо сейчас.

1 голос
/ 02 мая 2010

Все библиотеки std являются поточно-ориентированными, но не "асинхронными". Таким образом, вы можете вызывать одни и те же функции из разных потоков, но не из одних и тех же объектов.

...