android - 在 iOS 和 Android 上 memcpy() / mktime() 线程安全吗?
问题描述
我有一个 C 库,我正在交叉编译以在 Android 和 iOS 应用程序中使用。
它利用了memcpy()
,mktime()
所以我想知道这些函数在多线程环境中使用时是否是隐式线程安全的。
使用现代 Xcode 编译的 iOS 应用程序和使用现代 Android NDK 编译的 Android 库使用基于 LLVM 的 clang 编译器。
我已经查看了以下问题,但无法找到明确的答案:
解决方案
POSIX 要求其标准化的所有函数都是线程安全的,但相对较短的函数列表除外。 memcpy()
并且mktime()
都被 POSIX 覆盖,并且都不在例外列表中,因此 POSIX 要求它们是线程安全的(但请继续阅读)。
但是请注意,这与所使用的编译器无关,而是与支持您的应用程序的 C 库有关。我记得 Apple 的 C 库在某些方面不符合标准。尽管如此,从线程安全的角度来看,没有什么特别的memcpy()
,mktime()
这使得它们具有内在的风险。也就是说,没有理由期望他们访问任何共享数据,除了通过他们的 arguments 提供给他们的任何数据。
这就是问题所在。您可以依赖,也可以memcpy()
不依赖于mktime()
内部静态数据,但是 POSIX 对线程安全的要求并没有扩展到面对您通过选择参数创建的数据竞争时所记录的工作。因此,例如,如果两个不同的线程调用memcpy()
,并且一个调用的目标区域与另一个调用的源或目标区域重叠,那么您需要在线程之间进行一些同步。
推荐阅读
- javascript - 如何将数据从一个函数传递到另一个函数angularjs
- python - Python 3 decode("utf-8") 在应该只有空格的地方添加换行符。我要阻止这个吗?
- python - 如何旋转等高线图的标签?
- xamarin.android - 发送带有附件正文的邮件
- arrays - 如何找到数组中最大的回文子序列?
- reactjs - React.js:尽管 http 响应为 400,但仍收到错误消息
- amazon-web-services - docker 不创建文件
- kubernetes - 如何从命令行传递 imagePullSecrets
- concurrency - 移动可变引用向量的 Rust 生命周期问题
- leaflet - layerGroup 的传单更改图标