Последствия устаревания readdir_r для производительности? - PullRequest
0 голосов
/ 09 мая 2020

Когда я перекомпилировал файловую систему FUSE на новой рабочей станции, я заметил предупреждения об устаревании в отношении readdir_r. Поскольку readdir не является безопасным для MT и требует собственной синхронизации, я немного озадачен.

Я не уверен, что именно не является MT Safe - это readdir отдельно или это весь процесс чтения определенный каталог до конца? Кажется, что стандарт пытается оправдать это решение, указывая, что readdir является MT Safe, если он вызывается в разных каталогах, но это явно небезопасное предположение, если ваша «программа» представляет собой многопользовательскую файловую систему FUSE с наложением. Итак, следует ли поместить всю процедуру чтения каталога в критическую секцию или только отдельные readdir вызовы?

Оба случая, если честно, звучат для меня довольно плохо с точки зрения производительности - справедливы ли мои опасения или есть другие узкие места в Linux ядро, которое в любом случае делает невозможным параллельное чтение одного каталога более чем одним процессом / потоком?

1 Ответ

2 голосов
/ 09 мая 2020

В текущей спецификации POSIX.1 (POSIX.1-2008) readdir (3) не требуется для обеспечения многопоточности. Однако в современных реализациях (включая реализацию glib c) одновременные вызовы readdir (3), которые определяют разные потоки каталогов, являются потокобезопасными.

На странице руководства говорится, что это потокобезопасный (при условии, что вы используете glib c, что, я думаю, является справедливым предположением для Linux) - при условии, что вы используете разные потоки каталогов - не другой каталог.

Поток каталога - это параметр DIR * для readdir.

...