【问题标题】:Is memcpy process-safe?memcpy 进程安全吗?
【发布时间】:2013-02-15 05:04:43
【问题描述】:

我在网上查了一下,没有一个让自己满意的答案。

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

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

【问题讨论】:

  • 线程和进程是不同的东西。

标签: c++ c process thread-safety memcpy


【解决方案1】:

memcpy 不是线程/进程安全的

【讨论】:

  • 有趣,我猜相反。你有参考吗?
  • 顺便问一下,什么是“过程安全”?我应该认为这意味着我可以同时在两个不同的进程中调用memcpy。这应该是微不足道的,因为不同的进程实际上拥有自己的memcpy 副本,就像它们拥有自己的任何其他函数的副本一样多。 (或者至少操作系统保证,在共享 C 库的情况下,行为与每个进程都有自己的副本一样。)
  • 实际上不安全的是访问共享资源,例如从不同进程访问文件——但这并不意味着openreadwrite 不是进程安全的。 (无论如何,我如何向initexplorer.exe 发出我现在要打电话给write 的信号?)
  • @not-a-user:查看原始问题和答案。这将解释线程/进程安全的含义。您对资源的看法是正确的,这确实是问题:)。
【解决方案2】:

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

take_mutex(&mutex);
memcpy(dst, src, count);
yield_mutex(&mutex);

【讨论】:

  • 是的,您应该使用自己的锁定。但是因为你是在共享内存上操作,而不是因为memcpy不是线程安全的。
  • @temple:手册中没有说是,所以不是:) linux.die.net/man/3/memcpy
  • 这个答案不正确。 In Windows there are C runtime libraries that are threadsafe。 memcpy 在 Solaris 下是线程安全的。
  • 答案是正确的。如果您查看 MSVC 运行时的源代码,您会非常清楚地看到 memcpy() 没有同步。仅仅因为 Solaris 碰巧有一个线程安全的 memcpy() 并不意味着所有的实现都会,因为它没有指定 memcpy() 是否是线程安全的。因此,任何称职的程序员都会认为 memcpy() 是线程安全的,并用互斥锁保护它。
  • “线程安全”和“线程安全”之间存在混淆。您可以毫无问题地从不同的线程调用 memcpy。但是,您可以滥用线程安全的 memcpy 来创建数据竞争,然后所有的可能性都消失了。这显然是调用者打算做的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    memcpy 本身也是线程安全的,至少在 POSIX 系统上看到this one,因此我猜它也在 Windows 上。其他任何东西都会让它变得毫无用处。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 2010-10-26
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2010-11-12
      • 2018-05-12
      • 2019-07-24
      相关资源
      最近更新 更多