【发布时间】:2015-02-07 17:17:41
【问题描述】:
我有一个 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);
}
这会减慢文件的读取速度吗?你有更好的主意吗?
【问题讨论】:
-
让线程运行就行了,毕竟你不必使用结果。
-
你不能杀死一个分离的胎面:en.cppreference.com/w/cpp/thread/thread/detach
-
@UlrichEckhardt 如果我在线程运行时删除
fbuffer,程序就会崩溃。 -
为什么你还有一个指向这样一个缓冲区的指针?为什么线程不分配、填充然后转发缓冲区?不过,我从来没有说过你应该删除缓冲区。如果您使用引用计数,只需将指针设置为 null 并忘记在后台运行的线程。当线程结束时,它会销毁它的指针副本并自动释放缓冲区。
标签: c++ multithreading c++11 fopen