Предотвратить блокировку c ++ istream при вызове get и peek - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я читаю текстовый файл в c ++ с использованием istream, и я заметил, что istream блокирует файл после каждого чтения (особенно методы istream get и peek).

Если я правильно понимаю, эта блокировка происходит для обеспечения безопасности потоков, но я планирую использовать только один поток, поэтому она не нужна.

Есть ли способ предотвратить блокировку этого потока при чтении из istream?

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

P.S .: Я прикрепил изображение результатов VTune, содержащее обзор того, где тратится время.

VTune image of all the lock_file sections

1 Ответ

0 голосов
/ 07 сентября 2018

Хотя это не поддерживается, похоже, существуют некоторые хакерские способы сделать это:

для char = in.get () или in.get (char &), используйте std :: sbumpc .

для char = in.peek (), используйте std :: sgetc .

Итак:

// Old:
char c = in.get();
char p = in.peek();

// New:
char c = in.rdbuf()->sbumpc();
char p = in.rdbuf()->sgetc();

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

...