我有一个C库,可以交叉编译以在Android和iOS应用中使用。
它使用了memcpy()
和mktime()
,所以我想知道这些函数在多线程环境中使用时是否隐式线程安全。
使用现代Xcode编译的iOS应用和使用现代Android NDK编译的Android库均使用基于LLVM的clang编译器。
我已经审查了以下问题,但无法找到明确的答案:
答案 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()
不在其中。