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

时间:2018-07-03 14:06:21

标签: android ios c multithreading thread-safety

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

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

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

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

2 个答案:

答案 0 :(得分:4)

POSIX要求符合标准的实现,除相对较短的功能列表外,它标准化的所有功能都是线程安全的。 memcpy()mktime()都被POSIX涵盖,并且不在异常列表中,因此POSIX要求它们是线程安全的(但请继续阅读)。

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

有摩擦。您可以依靠memcpy()mktime()而不是内部依靠静态数据,但是POSIX对线程安全性的要求并没有扩展到您通过选择论点。因此,例如,如果两个不同的线程调用memcpy(),而一个调用的目标区域与另一个调用的源区域或目标区域重叠,则您需要在线程之间进行某种同步。

答案 1 :(得分:2)

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

我要说memcpy()确实是线程安全的。它不依赖于(全局)状态,该状态可能被运行memcpy()的多个实例所破坏。但是,这不是不是,这意味着有一些魔术可以阻止内存区域,该内存区域同时是 执行memcpy()的多个线程的复制目标搞砸了,即整个复制过程不是原子的。您必须使用 mutexes 来确保原子性。

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