可重入与线程安全

本文详细解读可重入与线程安全的概念,并通过代码实例展示它们之间的区别。阐述了可重入函数与线程安全代码块的特点,强调线程安全是可重入性的扩展。并通过具体的代码段说明如何确保线程安全。

一、引言

今天看网易公开课,孟宁老师的软件工程(C编码实践篇),讲到可重入和线程安全,结合他的讲解和我的理解,写下这篇博文,记录一下。

二、可重入与线程安全的关系

  • 可重入不一定是线程安全的
  • 线程安全的一定是可重入的
  • 不可重入函数一定不是线程安全的

孟老师最后的总结很不错:线程安全是扩大了范围的可重入,即可重入函数是指的单个函数,而线程安全则是真的代码块的可重入。

三、我的理解

可重入是针对一个函数的,可重入的函数是指,对与它操作的每一个变量都是它自己独占的(或者只操作局部变量,或者以锁机制来实现对共享变量的互斥访问),

而线程安全,是指,一段代码(可能包含多个函数)对变量的访问是它自己独占的(或者只使用局部变量,或者以锁机制来实现对共享变量的互斥访问)。

可重入的函数不一定是线程安全的,那么什么情况下可重入的函数不是线程安全的呢?下面这个例子就展示了这种情况:

pthread_mutex_t g_plus;
pthread_mutex_t g_minus;

int g_nCount = 0;

void Plus()
{
    pthread_mutex_lock(&g_plus);
    g_nCount++;
    pthread_mutex_unlock(&g_plus);
}

void Minus()
{
    pthread_mutex_lock(&g_minus);
    g_nCount++;
    pthread_mutex_unlock(&g_minus);
}

上面这段代码中,plus和minus都是可重入的函数,但是这段代码却不是线程安全的。如果要让它是线程安全的,那么对于全局变量g_nCount的操作使用一把锁即可。

线程安全的代码:

pthread_mutex_t g_mutexCount;

int g_nCount = 0;

void Plus()
{
    pthread_mutex_lock(&g_mutexCount);
    g_nCount++;
    pthread_mutex_unlock(&g_mutexCount);
}

void Minus()
{
    pthread_mutex_lock(&g_mutexCount);
    g_nCount++;
    pthread_mutex_unlock(&g_mutexCount);
}

这样这段代码块就是线程安全的了,因为对于全局变量g_nCount的访问使用的同一把锁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值