线程安全与可重入函数的区别及联系

一、线程安全

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 
  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
  线程安全问题都是由全局变量及静态变量引起的。
  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

二、可重入函数

可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。

可重入函数不为连续的调用持有静态数据;不返回指向静态数据的指针;所有数据都由函数的调用者提供;使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。绝不调用任何不可重入函数。

三、两者的区别与联系

函数可以是可重入的,是线程安全的,或者二者皆是,或者二者皆非。不可重入的函数不能由多个线程使用。另外,或许不可能让某个不可重入的函数是线程安全的。

   1、可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。

可重入函数与线程安全的区别与联系:

  2、线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。

  3、线程安全不一定是可重入的,而可重入函数则一定是线程安全的。

  4、如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

  5.如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。

  6、线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。

时间: 2024-10-10 09:43:02

线程安全与可重入函数的区别及联系的相关文章

线程安全和可重入函数的区别与联系

线程安全: 一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果.就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和 运行的结果是一样的,而且其他的变量的值也和预期的是一样  的, 就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说

线程安全与可重入函数的区别与联系

一. 线程安全 前面提到过线程的同步与互斥,也就是当两个线程同时访问到同一个临界资源的时候,如果对临界资源的操作不是原子的就会产生冲突,使得结果并不如最终预期的那样,比如如下的程序: #include <stdio.h> #include <pthread.h> int g_val = 0; void* fun(void *arg) {     int i = 0;     while(i++ < 500)     {            int tmp = g_val;

线程安全和可重入函数的区别和联系

线程安全函数 概念:        线程安全的概念比较直观.一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果.  确保线程安全:        要确保函数线程安全,主要需要考虑的是线程之间的共享变量.属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器.因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的.在对这些共享变量进行访问时,如果要保证线程安全

线程安全和可重入函数

一.线程安全 1.线程安全函数:C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的. (1)对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的,即是非线程安全的. (2) 在对这些共享变量进行访 问时,如果要保证线程安全,则必须通过加锁的方式. 2.线程安全的:                   如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的.                  

线程安全与可重入函数之间的区别与联系

线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和 运行的结果是一样的,而且其他的变量的值也和预期的是一样  的, 就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行

线程安全与可重入函数

一.线程安全    在目前线程是操作系统调度的最小单元,进程是资源分配的最小单元.在大多数操作系统中,一个进程可以同时派生出多个线程.这些线程独立执行,共享进程的资源.线程主要由控制流程和资源使用两部分构成,因此一个不得不面对的问题就是对共享资源的访问.为了确保资源得到正确的使用,我们在设计编写程序时需要考虑避免竞争条件和死锁,需要更多地考虑使用线程互斥变量. 如果我们的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的

线程安全和可重入函数之间的区别和联系

概念 重入:即重复调用,函数被不同的流调用,有可能会出现第一次调用还没返回时就再次进入该函数开始下一次调用. 可重入:当程序被多个线程反复执行,产生的结果正确. 如果一个函数只访问自己的局部变量或参数,称为可重入函数. 不可重入:当程序被多个线程反复调用,产生的结果出错. 当函数访问一个全局的变量或者参数时,有可能因为重入而造成混乱,像这样的函数称为不可重入函数. 线性安全:一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果. 可重入函数与线程安全的区别

线程安全与可重入函数的联系与区别

轻量级进程(LWP)是计算机操作系统中一种实现多任务的方法. 在计算机操作系统中,轻量级进程(LWP)是一种实现多任务的方法.与普通进程相比,LWP与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源:与线程相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系:这是和类Unix操作系统的系统调用vfork()生成的进程一样的.另外,线程既可由应用程序管理,又可由内核管理,而LWP只能由内核管理并像普通进程一样被调度.Linux内核是支持LWP的典型例子

可重入函数与线程安全的区别和联系

1.可重入函数 可重入函数即表示可以被多个执行流重复进入,意味着只使用自己栈上的变量,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰. 一个不可重入函数的例子: int global; int fun( int a ) { int temp; global = a; temp = gloabl*2; return temp; } global是一个全局变量,若进程a运行这段代码传入的参数是2,预期的结果是4:进程b也运行这段代码,传入的参数是3,由于操作系统的进程调