Android memcpy()/mktime()在iOS上是线程安全的吗&;安卓
我有一个C库,我正在交叉编译以用于Android和iOS应用程序 它使用了Android memcpy()/mktime()在iOS上是线程安全的吗&;安卓,android,ios,c,multithreading,thread-safety,Android,Ios,C,Multithreading,Thread Safety,我有一个C库,我正在交叉编译以用于Android和iOS应用程序 它使用了memcpy()和mktime(),因此我想知道这些函数在多线程环境中使用时是否隐式线程安全 使用现代Xcode编译的iOS应用程序和使用现代Android NDK编译的Android库使用基于LLVM的clang编译器 我回顾了以下问题,但未能找到明确的答案: 关于memcpy()是否是线程安全的问题可能会讨论 我想说memcpy()确实是线程安全的。它不依赖于(全局)状态,这可能会被运行的memcpy()的多个实
memcpy()
和mktime()
,因此我想知道这些函数在多线程环境中使用时是否隐式线程安全
使用现代Xcode编译的iOS应用程序和使用现代Android NDK编译的Android库使用基于LLVM的clang编译器
我回顾了以下问题,但未能找到明确的答案:
- 关于
memcpy()
是否是线程安全的问题可能会讨论
我想说memcpy()
确实是线程安全的。它不依赖于(全局)状态,这可能会被运行的memcpy()
的多个实例所破坏。然而,这并不意味着有某种魔法阻止了一个内存区域,该内存区域同时是执行memcpy()
的多个线程的复制目标,该区域被严重损坏,即复制过程作为一个整体不是原子的。您必须注意使用互斥体以确保原子性
mktime()
是线程安全的,因为它不使用静态缓冲区,而是使用全局状态或类似状态。手册页提到该系列中的一些函数不是线程安全的(它们具有相应的*\r函数),但mktime()
不在其中。可以讨论memcpy()
是否是线程安全的问题
我想说memcpy()
确实是线程安全的。它不依赖于(全局)状态,这可能会被运行的memcpy()
的多个实例所破坏。然而,这并不意味着有某种魔法阻止了一个内存区域,该内存区域同时是执行memcpy()
的多个线程的复制目标,该区域被严重损坏,即复制过程作为一个整体不是原子的。您必须注意使用互斥体以确保原子性
mktime()
是线程安全的,因为它不使用静态缓冲区,而是使用全局状态或类似状态。手册页提到该系列中的一些函数不是线程安全的(那些函数具有相应的*\r函数),但mktime()
不在其中。POSIX要求其标准化的所有函数都是线程安全的,但相对较短的函数列表除外memcpy()
和mktime()
都包含在POSIX中,并且都不在异常列表中,因此POSIX要求它们是线程安全的(但请继续阅读)
但是,请注意,这不是所使用的编译器的问题,而是支持应用程序的C库的问题。我记得苹果的C库在某些方面是不一致的。然而,从线程安全的角度来看,memcpy()
和mktime()
并没有什么特别的地方使它们具有内在的风险。也就是说,没有理由期望他们访问任何共享数据,除了通过其参数提供给他们的任何数据
这就是问题所在。您可以依靠
memcpy()
和mktime()
来避免内部依赖静态数据,但是POSIX对线程安全的要求并没有扩展到在您通过选择参数创建数据争用时所记录的工作。因此,例如,如果两个不同的线程调用memcpy()
,并且一个调用的目标区域与另一个调用的源区域或目标区域重叠,那么您需要在线程之间进行某种同步。POSIX要求一致的实现,即它标准化的所有函数都是线程安全的,除了相对较短的函数列表memcpy()
和mktime()
都包含在POSIX中,并且都不在异常列表中,因此POSIX要求它们是线程安全的(但请继续阅读)
但是,请注意,这不是所使用的编译器的问题,而是支持应用程序的C库的问题。我记得苹果的C库在某些方面是不一致的。然而,从线程安全的角度来看,memcpy()
和mktime()
并没有什么特别的地方使它们具有内在的风险。也就是说,没有理由期望他们访问任何共享数据,除了通过其参数提供给他们的任何数据
这就是问题所在。您可以依靠memcpy()
和mktime()
来避免内部依赖静态数据,但是POSIX对线程安全的要求并没有扩展到在您通过选择参数创建数据争用时所记录的工作。因此,例如,如果两个不同的线程调用memcpy()
,并且一个调用的目标区域与另一个调用的源区域或目标区域重叠,那么您需要在线程之间进行某种同步。太好了,这很有用(来自@Ctx的答案也是如此)。我的意思是,只要我没有对这些函数做任何愚蠢的事情,或者在多个线程上运行它们(我的实现只在一个线程上运行),那么我就应该可以了。我想Crashlytics的数据一旦上线就会告诉我另外一件事:-)@DaveAlden,“愚蠢”可能是主观的,但基本上是肯定的。特别是,只要所有memcpy()
s和mktime()
s的目的地都是局部变量,就不必担心。在某种程度上,目的地由图书馆的呼叫者提供,这绝不是你的问题。当你的库被不同的应用程序同时使用时,这也不是问题。很好,这很有用(正如@Ctx的答案)。我的意思是,只要我没有对这些函数做任何愚蠢的事情,也没有跨多个线程运行它们(我的实现只在一个线程上运行)