2013-09-03 4 views
1

У меня есть один класс «Resource Module», который управляет всеми ресурсами для моего приложения, и он читается в основном из одного файла «RESOURCES.DAT», где все есть.Multithread ifstream/ofstream

Все объекты, которые запрашивают новые данные из файла, проходят через ResourceModule, поэтому я могу управлять памятью и избегать дублирования ресурсов.

void SomeFunction() 
{ 
    Image* newImage = new Image(); 
    newImage->Load("imageName"); 
} 

void Image::Load(string imageName) 
{ 
    //Pointer to Image Data 
    _myImage = ResourceModule::GetResource(imageName); 
} 

Всегда есть только один ResourceModule. Я хочу сделать его многопоточным, поэтому, когда вызывается GetResource (string resourceName), он не работает.

Если я это сделать:

Image* ResourceModule::GetResource(string imageName) 
{ 
    ifstream fileReader; 
    fileReader.open("RESOURCES.DAT", ios::binary); 
    if(fileReader.is_open()) 
    { 
     //Do the reading, return the pointer 
    } 
} 

Является ли это многопоточный безопасно? Разве несколько потоков ifstreams/ofstreams конфликтуют друг с другом, когда я объявляю их так и читаю из файла того же файла? не

+0

связаны: http://stackoverflow.com/questions/2754303/is-stdifstream-thread-safe-lock-free –

+0

Чтение файлов безопасно делать одновременно ; если/когда вы решите, что хотите кэшировать данные файла чтения в памяти (например, чтобы второй раз, когда запрашивался ресурс, его не нужно читать с диска снова), вам потребуется сериализовать доступ к данным структура, в которой хранятся кэшированные данные. –

ответ

1

Нет

он будет работать так, как только для чтения, каждый экземпляр ifstream будет читать. Но это не проблема. Каждый поток ifstream будет иметь свою собственную позицию в файле и прогресс параллельно.

Вам не нужно ничего делать