【问题标题】:Is memcpy() / mktime() thread-safe on iOS & Android?在 iOS 和 Android 上 memcpy() / mktime() 线程安全吗?
【发布时间】:2018-12-11 21:22:54
【问题描述】:

我有一个 C 库,我正在交叉编译以在 Android 和 iOS 应用程序中使用。

它使用了memcpy()mktime(),所以我想知道这些函数在多线程环境中使用时是否是隐式线程安全的。

使用现代 Xcode 编译的 iOS 应用和使用现代 Android NDK 编译的 Android 库使用基于 LLVM 的 clang 编译器。

我已经查看了以下问题,但无法找到明确的答案:

【问题讨论】:

    标签: android ios c multithreading thread-safety


    【解决方案1】:

    memcpy() 是否是线程安全的问题可以讨论。

    我会说memcpy() 确实是线程安全的。它不依赖于(全局)状态,可能会被多个运行的memcpy() 实例破坏。然而,这并不意味着有一些魔法阻止了一个内存区域,这是 同时多个线程的复制目标memcpy() 被严重破坏,即整个复制过程不是原子的。你必须小心使用互斥锁来确保原子性。

    mktime() 是微不足道的线程安全的,因为它不使用静态缓冲区,使用全局状态或类似的。手册页提到该系列的一些函数不是线程安全的(它们具有相应的 *_r 函数),但 mktime() 不在其中。

    【讨论】:

      【解决方案2】:

      POSIX 要求其标准化的所有函数都是线程安全的,但相对较短的函数列表除外。 memcpy()mktime() 都包含在 POSIX 中,并且都不在例外列表中,因此 POSIX 要求它们是线程安全的(但请继续阅读)。

      但是请注意,这与所使用的编译器无关,而是与支持您的应用程序的 C 库有关。我记得 Apple 的 C 库在某些方面不符合标准。尽管如此,从线程安全的角度来看,memcpy()mktime() 并没有什么特别的地方使它们具有固有的风险。也就是说,没有理由期望他们访问任何共享数据,除了通过他们的参数提供给他们的任何数据

      还有问题。您可以依赖memcpy()mktime(),而不是在内部依赖静态数据,但是POSIX 对线程安全的要求并没有扩展到您通过选择参数创建的数据竞争时所记录的工作。因此,例如,如果两个不同的线程调用memcpy(),并且一个调用的目标区域与另一个调用的源或目标区域重叠,那么您需要在线程之间进行一些同步。

      【讨论】:

      • 太好了,这很有用(就像@Ctx 的答案一样)。我读这个的意思是,只要我不对这些函数做任何愚蠢的事情或跨多个线程运行它们(我的实现只在一个线程上运行),那么我应该没问题。我想 Crashlytics 数据一旦上线就会告诉我:-)
      • @DaveAlden,什么是“愚蠢”可能是主观的,但基本上,是的。特别是,只要你所有的memcpy()s 和mktime()s 的目的地都是局部变量,你就不用担心了。并且就您图书馆的调用者提供的目的地而言,这主要不是您的问题。当您的库被不同的应用同时使用时,这也不是问题。
      猜你喜欢
      • 2013-08-23
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多