线程安全和可重入函数的对比

本文探讨了可重入函数和线程安全的概念。可重入函数允许在执行过程中被中断并重新进入,需要保护全局变量以避免预期结果偏差。线程安全则关注多线程环境下对共享资源的保护,确保多线程执行结果与单线程一致。判断线程安全的方法是观察多线程运行是否改变单线程执行结果。两者的相似之处在于都需要处理对共享资源的访问,但可重入函数关注单线程内的中断操作,而线程安全关注多线程环境下的并发访问控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可重入函数

  可重入函数简单也就相当于可以被中断的函数,即一个函数正在执行的过程中被其他函数或操作中断出去,在这个中断操作执行完毕后,再返回来执行原代码。
  这里写图片描述

  那么如果这个中断出去的函数对i进行操作呢?
  假设这个中断函数对i直接进行加9,那么在中断函数返回之后i=9,sum只进行一次+=操作,但是原先的预期是从0+到9,所以跟我们的预期结果有很大的差异。
  所以对于可重入函数要进行对于全局属性的变量的保护。而不至于会出现这种类似中断操作进行打断的操作。

线程安全

  线程安全就是在多线程服务时,多个线程可能会访问同一块数据,则操作系统对这块邻界资源进行保护,这个在我之前的博客里面有详细说明。线程安全就是对邻界资源进行保护,线程不安全就是对邻界资源不进行保护。
 

判断线程是否安全

  如果代码所在的进程中有多个线程在运行这个代码,而每次多线程下运行的结果和单线程运行下相同,则证明你的代码线程是安全的。
 


  线程安全问题都是由全局变量及静态变量引起的。
  如果说有一个多线程的进程存在多个全局变量和静态变量,那么对这两种变量进行只读操作时,是断然不会出现线程安全事故的。
  只有在对这两种变量进行写,而系统又对这个“全局变量或静态变量”的“邻界资源”没有进行保护,那么绝对会出现线程安全问题。
  之前提到的二元信号量其实就是对邻界资源的一种保护方式:

未进行保护之前:

#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        return -1;
    }
    if(id==0)
    {
        while(1)
        {
            printf("A");
            fflush(stdout);
            //sleep(1);
            printf("A");
            fflush(stdout);
            //sleep(1);
        }
    }
    else
    {
        while(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值