Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 杀死正在执行memcpy的线程安全吗?_C++_Multithreading_Winapi_Terminate_Memory Mapped Files - Fatal编程技术网

C++ 杀死正在执行memcpy的线程安全吗?

C++ 杀死正在执行memcpy的线程安全吗?,c++,multithreading,winapi,terminate,memory-mapped-files,C++,Multithreading,Winapi,Terminate,Memory Mapped Files,上下文: 我正在开发一个需要快速访问大文件的应用程序,所以我使用内存映射。因此,读和写成为一个简单的memcpy。我现在尝试添加中止任何正在进行的读取或写入的功能 我想到的第一件事(因为我不知道任何可中断的memcpy函数)是周期性地memcpy几KB,并检查操作是否应该中止。如果读取速度相当快,这将确保近乎即时的流产 然而,如果不是这样,应用程序就不应该花费很长时间来中止,所以我的第二个想法是使用多线程。memcpy发生在它自己的线程中,控制线程在发出终止信号的事件上使用WaitForMult

上下文:

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

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

然而,如果不是这样,应用程序就不应该花费很长时间来中止,所以我的第二个想法是使用多线程。memcpy发生在它自己的线程中,控制线程在发出终止信号的事件上使用
WaitForMultipleObjects
,而memcpy线程。然后,如果发出终止事件的信号,它将终止memcpy线程。但是,声明应该绝对确保不会因为不释放ressource而使系统处于不良状态

问题:

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



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

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

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

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

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

如果您尽可能选择不同的设计,
TerminateThread
不应被视为正常功能,它更适合调试/电动工具

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

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

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

  • 有一个学派认为你不应该终止线程。考虑在代码大小为合理大小的块(例如兆字节)中执行该代码<代码> MycPy <代码>,其副本通常会持续几毫秒。您可以在复制后测试一些原子标志,或者使用互斥锁保护该副本,等等。。。这家伙比我更清楚“仍然有人认为调用Terminate-Thread是有道理的。”:好吧,我猜这个故事的寓意是:“memcpy不重要,TerminateThread只是一个可怕的想法”?那就是了!如果您将使用RealdFrase/RealFeFILE而不是异步文件句柄,您可以在任意TyMeRead中中断/取消读/写操作,这是一个学派,认为您不应该终止线程。考虑以代码大小(例如兆字节)的块来执行该代码<代码> MycPy < /C> >,其副本通常会持续几毫秒。您可以在复制后测试一些原子标志,或者使用互斥锁保护该副本,等等。。。这家伙比我更清楚“仍然有人认为调用Terminate-Thread是有道理的。”:好吧,我猜这个故事的寓意是:“memcpy不重要,TerminateThread只是一个可怕的想法”?那就是了!如果将ReadFile/WriteFile与异步文件句柄一起使用,则可以随时中断/取消读/写操作