gpt4 book ai didi

c++ - 读取大文件时杀死 std::thread

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:26 25 4
gpt4 key购买 nike

我有一个 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);
}

这会减慢文件的读取速度吗?你有更好的主意吗?

最佳答案

你应该不惜一切代价避免杀死一个线程。这样做会导致邪恶的事情发生,比如资源处于永久锁定状态。

必须为线程提供对标志的引用,该标志的值可以从其他地方设置,以告诉线程自愿退出。

您不能为此目的使用缓冲区;如果一个线程删除了缓冲区的内存,而另一个线程正在写入缓冲区,就会发生非常糟糕的事情。 (内存损坏。)因此,传递对 bool 标志的引用。

当然,为了让线程能够定期检查标志,它必须有小块的工作要做,所以将您的 fread 分成小块是个好主意。

256 字节可能有点太小了;绝对使用 4k 或更多,甚至可能是 64k。

关于c++ - 读取大文件时杀死 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com