杀死正在执行 memcpy 的线程是否安全?

pul*_*ser 1 c++ winapi multithreading terminate memory-mapped-files

语境:

我正在开发一个需要快速访问大文件的应用程序,因此我使用内存映射。memcpy阅读和写作因此变得简单。我现在正在尝试添加中止任何正在进行的读取或写入的功能。

我想到的第一件事(因为我不知道任何可中断的 memcpy 函数)是定期检查memcpy几KB并检查操作是否应该中止。如果读取速度相当快,这应该可以确保近乎瞬时的中止。

如果不是,那么应用程序不应该花费很长时间才能中止,所以我的第二个想法是使用多线程。memcpy 发生在它自己的线程中,控制线程使用WaitForMultipleObjects发出中止信号的事件和 memcpy 线程。如果中止事件收到信号,它将杀死 memcpy 线程。然而,TerminateThread 的文档指出,应该绝对确保不会因为不释放资源而使系统处于不良状态。

问题:

memcpy 是否会执行任何操作,导致在复制映射内存时杀死它变得不安全?这样做安全吗?它是否依赖于实现(使用与 Windows x86-64 不同的操作系统/体系结构)?


我确实意识到使用第二种方法可能完全是矫枉过正,因为实际上没有 1KB 读/写会花费那么长时间,但我只是想安全一点。

And*_*ers 5

如果可能的话,您应该选择不同的设计,TerminateThread不应将其视为正常功能,它更多地用于调试/电动工具。

我建议您创建一个包装器来memcpy分块复制。块大小实际上取决于您,取决于您的响应能力要求。1 MiB 可能是一个很好的起点。

如果你绝对想杀死线程,你必须考虑以下几点:

  • 显然,您不知道memcpy内部如何工作,也不知道它复制了多少,因此您必须假设中止时整个范围是未定义的。
  • 在某些版本的 Windows 上,终止线程会泄漏内存。有一些解决方法
  • 不要在线程中持有任何锁。