Linux线程不安全函数

线程安全函数

线程安全 就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程不安全函数

线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据;

线程不安全函数分类

线程不安全函数主要分为以下四大类:

  • 第1类:不保护共享变量的函数,
    函数中访问全局变量和堆。
    共享变量在多线程中是共享数据比如全局变量和堆,如果不保护共享变量,多线程时会出bug。
    可以通过同步机制来保护共享数据,比如加锁。

  • 第2类:函数中分配,重新分配释放全局资源。
    与上面第一点基本相同,通过加锁可解决

  • 第3类:返回指向静态变量的指针的函数,函数中通过句柄和指针的不直接访问。
    比如,
    我们要计算a,b两个变量的和,于是将a,b的指针传入某一个函数,然而此时可能有另一个线程改变了a,b的值,此时在函数中我们通过地址取到的两个数的值已经改变了,所以计算出的结果也就是错的了。
    又比如某些函数(如gethostbyname)将计算结果放在静态结构中,并返回一个指向这个结构的指针。
    在多线程中一个线程调用的结构可能被另一个线程覆盖。可以通过重写函数和加锁拷贝技术来消除。加锁拷贝技术指在每个位置对互斥锁加锁,调用线程不安全函数,动态的为结果分配存储器,拷贝函数返回的结构,然后解锁。

  • 第4类:调用线程不安全函数的函数
    在这里插入图片描述

编写线程安全函数的规则

编写线程安全函数时,要注意两点:

  • 减少对临界资源的依赖
    尽量避免访问全局变量,静态变量或其它共享资源,如果必须要使用共享资源,所有使用到的地方必须要进行互斥锁 (Mutex) 保护;

  • 线程安全的函数所调用到的函数也应该是线程安全的
    如果所调用的函数不是线程安全的,那么这些函数也必须被互斥锁 (Mutex) 保护;

常见线程不安全函数

# man pthreads
在这里插入图片描述
在这里插入图片描述
posix 规定,除了上面列出的函数之外,所有必需的函数,包含来自glibc的函数,都要用线程安全的方式来实现。
有些函数的传统接口会妨碍他们成为线程安全的函数,这个函数一定要以后缀_r表示对应的线程安全版本。比如: lrand48 和 lrand48_t;

参见

https://www.intel.com/content/dam/develop/external/us/en/documents/3-2-6-e7-ba-bf-e7-a8-8b-e5-ae-89-e5-85-a8-e5-87-bd-e6-95-b0-180203.pdf
https://www.cnblogs.com/yangjiannr/p/7391339.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值