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

时间:2018-02-10 18:53:18

标签: c++ multithreading winapi terminate memory-mapped-files

上下文

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

首先想到的是(因为我不知道任何可中断的memcpy函数)是定期memcpy几KB并检查操作是否应该中止。如果阅读速度相当快,这应该确保近乎即时的堕胎。

如果不是应用程序不应该花费很长时间才能中止,所以我的第二个想法是使用多线程。 memcpy发生在它自己的线程中,并且一个控制线程在发出堕胎信号的事件和memcpy线程上使用WaitForMultipleObjects。如果堕胎事件被发出信号,它就会杀死memcpy线程。但是,documentation on TerminateThread表示,如果不释放ressource,则应该绝对确定不会让系统处于错误状态。

问题:

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

我确实意识到使用第二种方法可能是完全矫枉过正的,因为没有1KB的读/写可以实现这么长时间,但我只想保证安全。

1 个答案:

答案 0 :(得分:4)

如果可能的话,你应该选择不同的设计,TerminateThread不应该被认为是正常的功能,它更适用于调试/电动工具。

我建议您创建一个围绕memcpy复制的包装器。块大小取决于您的响应性要求。 1 MiB可能是一个很好的起点。

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

  • 你显然不了解memcpy内部如何运作,也不知道它复制了多少,所以你必须假设当你中止时整个范围是不确定的。
  • 终止线程会在某些版本的Windows上泄漏内存。对此有workarounds
  • 不要在线程中持有任何锁。
相关问题