memset 线程安全_可重入性和线程安全性

本文详细探讨了memset函数的线程安全性和可重入性概念. 线程安全的函数使用锁来保护共享资源,如malloc()等;可重入函数不使用静态数据,不会因并发调用而相互干扰. ARM库中某些函数如memcpy()是线程安全的,但setlocale()等则不是. 对于memset,文章并未直接说明其线程安全性,但讨论了相关原则和注意事项.
摘要由CSDN通过智能技术生成

可重入性和线程安全性都与该函数如何处理资源有关. 但是,它们是不同的:

重入函数既不会在连续调用中存储静态数据,也不会返回指向静态数据的指针. 对于此类功能,调用者将提供该功能所需的所有数据,例如指向任何工作区的指针. 这意味着对一个函数的多个并发调用不会互相干扰.

注意: 可重入函数不能调用非可重入函数.

线程安全功能使用锁来保护共享资源,以防止并发访问它们. 线程安全仅涉及功能的实现方式,而不涉及其外部接口. 在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值