代码之家  ›  专栏  ›  技术社区  ›  DaveAlden

在iOS和Android上memcpy()/mktime()线程安全吗?

  •  1
  • DaveAlden  · 技术社区  · 6 年前

    我有一个C库,我正在交叉编译,用于Android&iOS应用程序。

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

    用现代xcode编译的iOS应用程序和用现代android ndk编译的android库使用基于llvm的clang编译器。

    我已经复习了以下问题,但找不到确切的答案:

    2 回复  |  直到 6 年前
        1
  •  4
  •   John Bollinger    6 年前

    POSIX要求一致的实现,它标准化的所有函数都是线程安全的,除了相对较短的函数列表。 memcpy() mktime() 这两个都被POSIX覆盖,并且都不在异常列表中,所以POSIX要求它们是线程安全的(但要继续阅读)。

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

    这就是问题所在。你可以依靠 内存(M) mktime()。 比如说,不要在内部依赖静态数据,但是POSIX对线程安全的要求并没有扩展到您通过选择参数创建的数据竞争中所记录的工作。因此,例如,如果两个不同的线程调用 内存(M) ,并且一个调用的目标区域与另一个调用的源区域或目标区域重叠,然后需要在线程之间进行某种风格的同步。

        2
  •  2
  •   Ctx    6 年前

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

    我会这么说的 内存(M) 确实是线程安全的。它不依赖(全局)状态,该状态可能会被多个 内存(M) 正在运行。然而,这, 意思是,有一些魔法阻止了记忆区域,也就是说 同时 多线程执行的复制目标 内存(M) 严重损坏,即整个复制过程 不是原子的 . 你得用它来照顾自己 互斥器 以确保原子性。

    mktime() 是普通的threadsafe,因为它不使用静态缓冲区,所以使用全局状态或类似状态。手册中提到了这个家族的一些功能 threadsafe(那些具有相应的*功能),但是 mktime()。 不在其中。