C 语言编程 — 线程安全与线程非安全

举报
云物互联 发表于 2021/08/05 23:22:23 2021/08/05
【摘要】 目录 文章目录 目录线程安全与线程非安全C 语言的线程非安全函数(不可重入函数) 线程安全与线程非安全 多线程程序中,线程安全是必须要考虑的因素。 线程安全(Thread Safe)就是在多线程环境中,多个线程在同一时刻对同一份资源(e.g. 寄存器、内存空间、全局变量、静态变量 etc.)进行写操作(读操作不会涉及线程安全的问题)时,不会出现数据不...

目录

线程安全与线程非安全

多线程程序中,线程安全是必须要考虑的因素。

线程安全(Thread Safe)就是在多线程环境中,多个线程在同一时刻对同一份资源(e.g. 寄存器、内存空间、全局变量、静态变量 etc.)进行写操作(读操作不会涉及线程安全的问题)时,不会出现数据不一致。反正,则是线程非安全(None-Thread Safe)的。

为了确保在多线程环境中的线程安全,就要确保数据的一致性,即:线程安全检查。这是一种对资源写操作进行控制的方法论,最简单的方式就是保证多个线程对同一资源的读写顺序,即:加锁机制。

显然,线程安全检查的实现会带来一定的系统开销。相对的,在单线程环境中并不需要考虑线程安全的问题。这就引入了多线程和单线程的执行效率问题,很难一概而论,而是需要针对不同的场景进行性能的测试才可以得出结果。

C 语言的线程非安全函数(不可重入函数)

C语言中大部分函库函数都是线程安全的,但是也有几个常用函数是线程不安全的,也叫不可重入函数。

线程不安全函数原因:是因为这些系统函数使用了某些全局或者静态变量。我们知道,全局变量和静态变量分别对应内存中的全局变量区和静态存储区,这些区域都是可以跨函数跨线程访问的。一旦在多线程环境中使用,在没有加锁的情况下,对同一段内存块进行并发读写,就会造成 Segmentfault/CoreDump 之类的问题。

常见的线程不安全类型有两类:

  1. 函数依赖了全局变量,并且会修改全局变量,如 rand() 函数的实现每次调用都会修改和读取一个全局的 INT。
  2. 函数返回了静态变量,如 ctime() 函数。

C 语言的不可重入函数汇总:
在这里插入图片描述

C 语言常用的多线程库:一般是 pthread,当然也可以使用 GLIB 中的 gthread,上述的线程安全版本可以兼容这两个库开发的多线程程序。

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/106131198

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。