gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:41:19 35 4
gpt4 key购买 nike

上下文:

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

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

如果不是,那么应用程序不应花费很长时间才能中止,所以我的第二个想法是使用多线程。 memcpy 发生在它自己的线程中,控制线程在发出终止信号的事件上使用 WaitForMultipleObjects,以及 memcpy 线程。如果发出终止事件信号,它会终止 memcpy 线程。然而,documentation on TerminateThread指出人们应该绝对确定不会通过不释放资源等方式使系统处于不良状态。

问题:

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


我确实意识到使用第二种方法可能完全矫枉过正,因为现实中没有 1KB 读/写每次都需要那么长时间,但我只是想安全起见。

最佳答案

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

我建议您围绕 memcpy 创建一个包装器,以 block 形式进行复制。 block 大小完全取决于您,取决于您的响应能力要求。 1 MiB 可能是一个很好的起点。

如果你绝对想杀死线程,你必须考虑几件事:

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

关于c++ - 杀死正在执行 memcpy 的线程是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724415/

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