我是靠谱客的博主 自由紫菜,最近开发中收集的这篇文章主要介绍linux多线程学习笔记五--线程安全,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一,线程安全基础

一个函数被称为线程安全的当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。我们能够定义出四类线程不安全函数。

第一类:不保护共享变量的函数

共享变量在多线程中是共享数据,可以通过同步机制来保护共享数据。

第二类:保护跨越多个调用状态的函数

一个伪随机数生成器是一个简单的例子:

unsigned int next=1;
int rand(void)
{
     next=next*1103515245+12345;
     return (unsigned int )(next/65536)%32768;
}
void srand(unsigned int seed)
{
     next=seed;
}
rand函数是线程不安全的,因为当前调用的结果依赖于前次调用的中间结果。

第三类:返回指向静态变量的指针的函数

某些函数(如gethostbyname)将计算结果放在静态结构中,并返回一个指向这个结构的指针。在多线程中一个线程调用的结构可能被另一个线程覆盖。可以通过重写函数和加锁拷贝技术来消除。加锁拷贝技术指在每个位置对互斥锁加锁,调用线程不安全函数,动态的为结果分配存储器,拷贝函数返回的结构,然后解锁。

第四类:调用线程不安全函数
常见的系统线程不安全函数:

线程不安全函数线程不安全 类unix线程安全版本
rand2 rand_r
strtok2strtok_r
asctime3asctime_r
ctime3ctime_r
gethostbyaddr3gethostbyaddr_r
geyhostbyname3gethostbyname_r
inet_ntoa3 
localtime3localtime_r

二、可重入性

有一类重要的线程安全函数,叫做可重入函数,其特点:当它们被多个线程调用时,不会引用任何共享数据。可重入、线程安全函数之间的关系如下图。



最后

以上就是自由紫菜为你收集整理的linux多线程学习笔记五--线程安全的全部内容,希望文章能够帮你解决linux多线程学习笔记五--线程安全所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部