У меня есть std::thread
функцию, призывающие fopen
загрузить большой файл в массив:убийство станд :: нить при чтении больших файлов
void loadfile(char *fname, char *fbuffer, long fsize)
{
FILE *fp = fopen(fname, "rb");
fread(fbuffer, 1, fsize, fp);
flose(fp);
}
Это вызывается:
std::thread loader(loadfile, fname, fbuffer, fsize);
loader.detach();
В какой-то момент что-то в моей программе хочет прекратить чтение этого файла и запросить другой файл. Проблема в том, что к моменту удаления указателя fbuffer
поток loader
все еще продолжается, и я получаю условие гонки, которое бросает исключение.
Как я могу убить эту ветку? Моя идея состояла в том, чтобы проверить наличие требуемого fbuffer
и, возможно, разделить fread
небольших порций:
void loadfile(char *fname, char *fbuffer, long fsize)
{
FILE *fp = fopen(fname, "rb");
long ch = 0;
while (ch += 256 < fsize)
{
if (fbuffer == NULL) return;
fread(fbuffer + ch, 1, 256, fp);
}
fclose(fp);
}
Будет ли это замедляет чтение файла? У вас есть идея?
Просто пропустите поток, вам не обязательно использовать результат в конце концов. –
Вы не можете убить отдельный протектор: http://en.cppreference.com/w/cpp/thread/thread/detach –
@UlrichEckhardt, если я удалю 'fbuffer', когда поток запущен, программа выйдет из строя. –