首页 > 解决方案 > 在 iOS 和 Android 上 memcpy() / mktime() 线程安全吗?

问题描述

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

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

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

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

标签: androidioscmultithreadingthread-safety

解决方案


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

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

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


推荐阅读