2013-09-26 1 views
0

Мне нужно кэшировать указатели файлов в моей программе, но проблема в том, что у меня может быть несколько потоков, обращающихся к кешу указателя на файл. Например, если thread1 запрашивает указатель на файл, и возникает ошибка кеша, вызывается fopen и указатель кэшируется. Теперь, когда поток 2 приходит и происходит кеш, оба файла совместно используют указатель чтения/записи, приводящий к ошибкам. Некоторые вещи я думал -Кэширование указателей файлов в C

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

Как следует продолжать?

+1

Зачем вам нужно кэшировать? –

+1

Возможно, каждый поток должен иметь свой собственный кеш? – SteveP

+0

Использовать 'TLS' как @SteveP. Прочтите http://en.wikipedia.org/wiki/Thread-local_storage –

ответ

0

Вы обеспокоены оптимизацией операции открытия файла? Я думаю, вы делаете это более сложным и склонным к ошибкам, чем то, что должно быть. Указатели файлов (FILE*) не являются потокобезопасными структурами, поэтому вы не можете делиться ими по потокам.

То, что вы, вероятно, нужно сделать (если вы действительно хотите кэшировать файл открытых операций), чтобы сохранить словарное отображение файла в файл дескриптор (int) и имеет поточно-функцию, чтобы вернуться дескриптор по имени или открытый, если он не находится в словаре.

И, конечно, нужно также регулировать ввод-вывод в один и тот же файловый дескриптор из нескольких потоков.