8

我在网上看了,并没有让自己满意的答案。

memcpy 线程安全吗?(在 Windows 中)

我的意思是,如果我使用单个 memcpy 写入进程之间共享的内存区域(使用 boost::shared_memory_object),然后尝试使用单个 memcpy 从另一个进程读取该区域,那么在写入时一个进程会自动被阻止发生?我在哪里可以读到这个?

4

4 回答 4

12

memcpy 通常针对原始速度进行编码。它不会是线程安全的。如果你需要这个,你需要在临界区中执行 memcpy 调用或者使用一些其他的信号机制。

take_mutex(&mutex);
memcpy(dst, src, count);
yield_mutex(&mutex);
于 2013-02-28T20:38:25.357 回答
6

memcpy 不是线程/进程安全的

于 2013-02-28T20:37:42.897 回答
4

像 memcpy()(或 memmove())这样的例程是标准 C 库的一部分,包含在标准 <string.h> 头文件中,并且对任何锁定机制一无所知。锁定应该由一些外部方式提供,如进程间互斥体、信号量或类似的东西。

于 2013-02-28T21:13:54.880 回答
4

您混淆了“原子”和“线程安全”。如果您memcpy在共享区域中同时读取和写入数据(有或没有),那是不安全的。当然,复制数据本身是线程安全的。

memcpy本身也是线程安全的,至少在 POSIX 系统上看到这个,因此我猜它也在 Windows 上。其他任何事情都会使它变得毫无用处。

如果它是“自动阻塞”,它必须是原子的(或者至少管理它自己的锁),这会减慢你的系统。因此,在您的情况下,您应该使用自己的锁。

于 2013-11-14T16:50:26.427 回答