У меня есть один класс «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 конфликтуют друг с другом, когда я объявляю их так и читаю из файла того же файла? не
связаны: http://stackoverflow.com/questions/2754303/is-stdifstream-thread-safe-lock-free –
Чтение файлов безопасно делать одновременно ; если/когда вы решите, что хотите кэшировать данные файла чтения в памяти (например, чтобы второй раз, когда запрашивался ресурс, его не нужно читать с диска снова), вам потребуется сериализовать доступ к данным структура, в которой хранятся кэшированные данные. –