上下文
我正在开发一个需要快速访问大文件的应用程序,因此我使用内存映射。因此,阅读和写作变得简单memcpy
。我现在正在尝试添加中止正在进行的任何读取或写入的功能。
首先想到的是(因为我不知道任何可中断的memcpy函数)是定期memcpy
几KB并检查操作是否应该中止。如果阅读速度相当快,这应该确保近乎即时的堕胎。
如果不是应用程序不应该花费很长时间才能中止,所以我的第二个想法是使用多线程。 memcpy发生在它自己的线程中,并且一个控制线程在发出堕胎信号的事件和memcpy线程上使用WaitForMultipleObjects
。如果堕胎事件被发出信号,它就会杀死memcpy线程。但是,documentation on TerminateThread表示,如果不释放ressource,则应该绝对确定不会让系统处于错误状态。
问题:
在复制映射内存时,memcpy是否会执行任何会导致其不安全的事情?这样做是否安全?它是依赖于实现的(使用与Windows x86-64不同的操作系统/体系结构)?
我确实意识到使用第二种方法可能是完全矫枉过正的,因为没有1KB的读/写可以实现这么长时间,但我只想保证安全。
答案 0 :(得分:4)
如果可能的话,你应该选择不同的设计,TerminateThread
不应该被认为是正常的功能,它更适用于调试/电动工具。
我建议您创建一个围绕memcpy
复制的包装器。块大小取决于您的响应性要求。 1 MiB可能是一个很好的起点。
如果您绝对想杀死线程,则必须考虑以下几点:
memcpy
内部如何运作,也不知道它复制了多少,所以你必须假设当你中止时整个范围是不确定的。