可重入性和线程安全性都与该函数如何处理资源有关. 但是,它们是不同的:
重入函数既不会在连续调用中存储静态数据,也不会返回指向静态数据的指针. 对于此类功能,调用者将提供该功能所需的所有数据,例如指向任何工作区的指针. 这意味着对一个函数的多个并发调用不会互相干扰.
注意: 可重入函数不能调用非可重入函数.
线程安全功能使用锁来保护共享资源,以防止并发访问它们. 线程安全仅涉及功能的实现方式,而不涉及其外部接口. 在C语言中,局部变量在堆栈上动态分配. 因此,任何不使用静态数据或其他共享资源的函数通常都是线程安全的.
在ARM库中,函数可能是线程安全的,如下所示:
某些函数永远都不是线程安全的,例如setlocale()
某些函数本质上是线程安全的,例如memcpy()
通过实现_mutex_ *函数,可以使某些函数(例如malloc())成为线程安全的
其他函数仅在传递适当的参数(例如tmpnam())时才是线程安全的.
如果应用程序以隐藏方式(例如,使用语言助手功能)使用ARM库,则可能会出现线程问题.
线程安全功能
calloc(),
free(),
malloc(),
realloc()
如果实现了_mutex_ *函数,则堆函数是线程安全的.
在所有线程之间共享一个堆,并使用互斥锁避免在并发访问期间破坏数据. 每个堆实现负责其自己的锁定. 如果您提供自己的分配器,它也必须锁定. 这样,它可以执行精细锁定(如果需要),而不是简单地使用单个互斥对象保护整个堆(扩展锁定).
__ alloca(),
__ alloca_finish(),
__ alloca_init(),
__ alloca_initialize()
如果实现了_mutex_ *函数,则alloca函数是线程安全的.
每个线程的alloca状态包含在__user_perthread_libspace块中. 这意味着多个线程不会冲突.
请注意,alloca函数也使用堆. 但是堆函数都是线程安全的.
abort(),
raise(),
signal(),
fen