精华内容
下载资源
问答
  • 可重入与异步信号安全 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码... 有人将可重入函数与线程安全函数混为一谈,我认为是不正确的

    可重入与异步信号安全
    一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。
    《多线程编程指南》中定义,可以被信号控制器安全调用的函数被称为"异步信号安全"函数。
    因此,我认为可重入与异步信号安全是一个概念。

    有人将可重入函数与线程安全函数混为一谈,我认为是不正确的。

    这里引用CSAPP中的描述来说明一下:
    --------------------------------------------------
    CSAPP
    13.7.1 线程安全
    一个函数被称为线程安全的,当且仅当被多个并发线程反复的调用时,它会一直产生正确的结果。
    13.7.2 可重入性
    有一类重要的线程安全函数,叫做可重入函数,其特点在于它们具有一种属性:当它们被多个线程调用时,不会引用任何共享的数据。

    尽管线程安全和可重入有时会(不正确的)被用做同义词,但是它们之间还是有清晰的技术差别的。可重入函数是线程安全函数的一个真子集。
    --------------------------------------------------

    重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是 purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。
    可重入函数是线程安全函数,但是反过来,线程安全函数未必是可重入函数。
    实际上,可重入函数很少,APUE 10.6节中描述了Single UNIX Specification说明的可重入的函数,只有115个;APUE 12.5节中描述了POSIX.1中不能保证线程安全的函数,只有89个。

    信号就像硬件中断一样,会打断正在执行的指令序列。信号处理函数无法判断捕获到信号的时候,进程在何处运行。如果信号处理函数中的操作与打断的函数的操作 相同,而且这个操作中有静态数据结构等,当信号处理函数返回的时候(当然这里讨论的是信号处理函数可以返回),恢复原先的执行序列,可能会导致信号处理函 数中的操作覆盖了之前正常操作中的数据。
    不可重入函数的原因在于:
    1> 已知它们使用静态数据结构
    2> 它们调用malloc和free.
    因为malloc通常会为所分配的存储区维护一个链接表,而插入执行信号处理函数的时候,进程可能正在修改此链接表。
    3> 它们是标准IO函数.
    因为标准IO库的很多实现都使用了全局数据结构

    即使对于可重入函数,在信号处理函数中使用也需要注意一个问题就是errno。一个线程中只有一个errno变量,信号处理函数中使用的可重入函数也有可 能会修改errno。例如,read函数是可重入的,但是它也有可能会修改errno。因此,正确的做法是在信号处理函数开始,先保存errno;在信号 处理函数退出的时候,再恢复errno。

    例如,程序正在调用printf输出,但是在调用printf时,出现了信号,对应的信号处理函数也有printf语句,就会导致两个printf的输出混杂在一起。
    如果是给printf加锁的话,同样是上面的情况就会导致死锁。对于这种情况,采用的方法一般是在特定的区域屏蔽一定的信号。
    屏蔽信号的方法:
    1> signal(SIGPIPE, SIG_IGN); //忽略一些信号
    2> sigprocmask()
    sigprocmask只为单线程定义的
    3> pthread_sigmask()
    pthread_sigmasks可以在多线程中使用

    现在看来信号异步安全和可重入的限制似乎是一样的,所以这里把它们等同看待;-)

    线程安全
    线程安全:如果一个函数在同一时刻可以被多个线程安全的调用,就称该函数是线程安全的。

    不需要共享时,请为每个线程提供一个专用的数据副本。如果共享非常重要,则提供显式同步,以确保程序以确定的方式操作。通过将过程包含在语句中来锁定和解除锁定互斥,可以使不安全过程变成线程安全过程,而且可以进行串行化。

    很多函数并不是线程安全的,因为他们返回的数据是存放在静态的内存缓冲区中的。通过修改接口,由调用者自行提供缓冲区就可以使这些函数变为线程安全的。
    操作系统实现支持线程安全函数的时候,会对POSIX.1中的一些非线程安全的函数提供一些可替换的线程安全版本。
    例如,gethostbyname()是线程不安全的,在Linux中提供了gethostbyname_r()的线程安全实现。
    函数名字后面加上"_r",以表明这个版本是可重入的(对于线程可重入,也就是说是线程安全的,但并不是说对于信号处理函数也是可重入的,或者是异步信号安全的)。

    多线程程序中常见的疏忽性问题
    1> 将指针作为新线程的参数传递给调用方栈。
    2> 在没有同步机制保护的情况下访问全局内存的共享可更改状态。
    3> 两个线程尝试轮流获取对同一对全局资源的权限时导致死锁。其中一个线程控制第一种资源,另一个线程控制第二种资源。其中一个线程放弃之前,任何一个线程都无法继续
    操作。
    4> 尝试重新获取已持有的锁(递归死锁)。
    5> 在同步保护中创建隐藏的间隔。如果受保护的代码段包含的函数释放了同步机制,而又在返回调用方之前重新获取了该同步机制,则将在保护中出现此间隔。结果具有误导性。对于调用方,表面上看全局数据已受到保护,而实际上未受到保护。
    6> 将UNIX 信号与线程混合时,使用sigwait(2) 模型来处理异步信号。
    7> 调用setjmp(3C) 和longjmp(3C),然后长时间跳跃,而不释放互斥锁。
    8> 从对*_cond_wait() 或*_cond_timedwait() 的调用中返回后无法重新评估条件。


    总结
    判断一个函数是不是可重入函数,在于判断其能否可以被打断,打断后恢复运行能够得到正确的结果。(打断执行的指令序列并不改变函数的数据)
    判断一个函数是不是线程安全的,在于判断其能否在多个线程同时执行其指令序列的时候,保证每个线程都能够得到正确的结果。

    如果一个函数对多个线程来说是可重入的,则说这个函数是线程安全的,但这并不能说明对信号处理程序来说该函数也是可重入的。
    如果函数对异步信号处理程序的重入是安全的,那么就可以说函数是"异步-信号安全"的。

     

     

     

     

     

     

     

     

     

     

    线程安全函数
    • 概念:
    线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。
    • 确保线程安全:
    要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄 存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访 问时,如果要保证线程安全,则必须通过加锁的方式。
    • 线程不安全的后果:
    线程不安全可能导致的后果是显而易见的——共享变量的值由于不同线程的访问,可能发生不可预料的变化,进而导致程序的错误,甚至崩溃。

        可重入函数
    • 概念:
    可重入的概念基本没有比较正式的完整解释,多数的文档都只是说明什么样的情况才能保证函数可重入,但没有完整定义。按照Wiki上的说法,“A computer program or routine is described as reentrant if it can be safely executed concurrently; that is, the routine can be re-entered while it is already running.”根据笔者的经验,所谓“重入”,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理 函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处 理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入的。
    • 确保可重入:
    要确保函数可重入,需满足以下几个条件:
    1、不在函数内部使用静态或全局数据
    2、不返回静态或全局数据,所有数据都由函数的调用者提供。
    3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
    4、不调用不可重入函数。
    • 不可重入的后果:
    不可重入的后果主要体现在象信号处理函数这样需要重入的情况中。如果信号处理函数中使用了不可重入的函数,则可能导致程序的错误甚至崩溃。

     

     

     

     

     

     

     

     

     

    展开全文
  • 如果同一个进程的多条线程可以同时安全的调用某一函数,那么该函数就是可重入的。此处,“安全”意味着,无论其他线程调用该函数的执行状态如何,函数均可产生预期结果。 SUSv3对可重入函数的定...

    要解释可重入函数为何物,首先需要区分单线程程序和多线程程序。典型UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令。而对于多线程程序而言,同一进程却存在多条独立、并发的执行逻辑流。

    如果同一个进程的多条线程可以同时安全的调用某一函数,那么该函数就是可重入的。此处,“安全”意味着,无论其他线程调用该函数的执行状态如何,函数均可产生预期结果。

    SUSv3对可重入函数的定义是:函数有两条或多条线程调用时,即便是交叉执行,其效果也与各线程以任意顺序依次调用时一致。

    更新全局变量或者静态数据结构的函数可能是不可重入的。(只用到本地变量的函数肯定是可重入的。)

    C语言标准函数库中,malloc和free就维护有一个针对已释放内存块的链表,用于从堆中重新分配内存。如果主程序在调用malloc期间为一个同样调用malloc的信号处理器函数所中断,那么该链表可能会遭到破坏。因此,malloc函数族以及使用它们的其他库函数都是不可重入的。


    异步信号安全函数是指当信号处理器函数调用时,可以保证其实现是安全的。如果某一函数是可重入的,又或者信号处理器函数无法将其中断时就称该函数是异步信号安全的。


    若函数可同时供多个线程安全调用,则称之为线程安全函数;反之,如果函数不是线程安全的,则不能并发调用。

    由此可以看出,可重入函数一定是线程安全函数,不可重入函数也可能是线程安全函数,例如,malloc函数是不可重入函数,但是malloc函数通过使用互斥量实现了线程安全。

    展开全文
  • 重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于...

      重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入的。

      要确保函数可重入,需满足一下几个条件:

        1、不在函数内部使用静态或全局数据 
        2、不返回静态或全局数据,所有数据都由函数的调用者提供。 
        3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
        4、不调用不可重入函数。

     

      线程安全:一个函数被称为线程安全的,当且仅当被多个并发线程反复的调用时,它会一直产生正确的结果。要确保函数线程安全,主要需要考虑的是线程之间的共享变量。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。  

      可重入与线程安全并不等同,一般说来,可重入的函数一定是线程安全的,但反过来不一定成立。

       

      可以被信号控制器安全调用的函数被称为"异步信号安全"函数。信号就像硬件中断一样,会打断正在执行的指令序列。信号处理函数无法判断捕获到信号的时候,进程在何处运行。如果信号处理函数中的操作与打断的函数的操作相同,而且这个操作中有静态数据结构等,当信号处理函数返回的时候(当然这里讨论的是信号处理函数可以返回),恢复原先的执行序列,可能会导致信号处理函数中的操作覆盖了之前正常操作中的数据。

      不可重入函数的原因在于:

        1. 已知它们使用静态数据结构

        2.它们调用malloc和free.因为malloc通常会为所分配的存储区维护一个链接表,而插入执行信号处理函数的时候,进程可能正在修改此链接表。

        3. 它们是标准IO函数.因为标准IO库的很多实现都使用了全局数据结构。

      即使对于可重入函数,在信号处理函数中使用也需要注意一个问题就是errno。一个线程中只有一个errno变量,信号处理函数中使用的可重入函数也有可能会修改errno。例如,read函数是可重入的,但是它也有可能会修改errno。因此,正确的做法是在信号处理函数开始,先保存errno;在信号处理函数退出的时候,再恢复errno。

      举个例子

      例如,程序正在调用printf输出,但是在调用printf时,出现了信号,对应的信号处理函数也有printf语句,就会导致两个printf的输出混杂在一起。如果是给printf加锁的话,同样是上面的情况就会导致死锁。对于这种情况,采用的方法一般是在特定的区域屏蔽一定的信号。

      屏蔽信号的方法:

        1. signal(SIGPIPE, SIG_IGN); //忽略一些信号

        2. sigprocmask()  sigprocmask只为单线程定义的

        3 pthread_sigmask() pthread_sigmasks可以在多线程中使用

     

      所以异步信号安全函数 也尅就是函数中没有访问到被某个同步锁锁住的变量,即使函数执行的过程中被某个信号中断,程序也不会发生死锁的情况。

     

    总结
    判断一个函数是不是可重入函数,在于判断其能否可以被打断,打断后恢复运行能够得到正确的结果。(打断执行的指令序列并不改变函数的数据)
    判断一个函数是不是线程安全的,在于判断其能否在多个线程同时执行其指令序列的时候,保证每个线程都能够得到正确的结果。
    如果一个函数对多个线程来说是可重入的,则说这个函数是线程安全的,但这并不能说明对信号处理程序来说该函数也是可重入的。
    如果函数对异步信号处理程序的重入是安全的,那么就可以说函数是"异步-信号安全"的。

    转载于:https://www.cnblogs.com/wolfrickwang/p/3729465.html

    展开全文
  • 以上三者的关系为:可重入函数 必然 是 线程安全函数异步信号安全函数; 线程安全函数不一定是可重入函数。 可重入与线程安全的区别体现在能否在signal处理函数中被调用的问题上,可重入函数在signal处理函数中...

    1.

    Reentrant Function: A function whose

    effect, when called by two or more threads,is guaranteed to be as

    ifthe threads each executed the function one after

    another in an undefined order, even if the actual execution is

    interleaved.

    2.

    Thread  Safe

    Function:A function that may be safely invoked concurrently

    by multiple threads.

    3.

    Async-Signal Safe Function: A function

    that may be invoked, without restriction from signal-catching

    functions. No functionis async-signal -safe unless explicitly

    described as such.

    以上三者的关系为:可重入函数 必然 是 线程安全函数

    和 异步信号安全函数; 线程安全函数不一定是可重入函数。

    可重入与线程安全的区别体现在能否在signal处理函数中被调用的问题上,可重入函数在signal处理函数中可以被安全调用,因此同时也是Async-Signal-Safe

    Function;而线程安全函数不保证可以在signal处理函数中被安全调用,如果通过设置信号阻塞集合等方法保证一个非可重入函数不被信号中断,那么它也是Async-Signal-Safe

    Function。

    举个例子,strtok是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r既是可重入的,也是线程安全的。也就是说函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是可重入的。我们所熟知的malloc也是线程安全但不是可重入的。

    再举个例子,假设函数func()在执行过程中需要访问某个共享资源,因此为了实现线程安全,在使用该资源前加锁,在不需要资源解锁。

    假设该函数在某次执行过程中,在已经获得资源锁之后,有异步信号发生,程序的执行流转交给对应的信号处理函数;再假设在该信号处理函数中也需要调用函数

    func(),那么func()在这次执行中仍会在访问共享资源前试图获得资源锁,然而我们知道前一个func()实例已然获得该锁,因此信号处理函数阻塞;另一方面,信号处理函数结束前被信号中断的线程是无法恢复执行的,当然也没有释放资源的机会,这样就出现了线程和信号处理函数之间的死锁局面。因此,func()尽管通过加锁的方式能保证线程安全,但是由于函数体对共享资源的访问,因此是非可重入。对于这种情况,采用的方法一般是在特定的区域屏蔽一定的信号。

    二、可重入函数

    我们知道,当捕捉到信号时,不论进程的主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数返回后再继续执行主控制流程。信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。

    不可重入函数的原因在于:详见《Linux系统编程手册第349页》

    1.

    更新全局变量或静态数据结构的函数是不可重入的,只用到本地变量的函数肯定是可重入的。

    2.

    调用malloc和free。因为malloc通常会为所分配的存储区维护一个链接表,而插入执行信号处理函数的时候,进程可能正在修改此链接表。因此malloc()函数簇以及使用他们的其他库函数都是不可重入的。

    3.

    使用了经静态分配的内存来返回信息的函数。

    4.

    标准IO函数。因为标准IO库的很多实现都使用了全局数据结构。

    5. 将静态数据结构用于内部记账的函数也是不可重入的。像printf()

    scnaf()等,他们会为缓冲区I/O更新内部数据结构。

    三.

    sig_atomic_t类型与volatile限定符

    即使是一条C语句也不一定是一个原子操作,比如 a = 5;

    如果a是32位的int变量,在32位机上赋值是原子操作(需要4字节对齐),在16位机上就不是(注:一个字节的简单读写如bool类型,都是原子性的)。如果在程序中需要使用一个变量,要保证对它的读写都是原子操作,应该采用什么类型呢?为了解决这些平台相关的问题,C标准定义了一个类型sig_atomic_t,在不同平台的C语言库中取不同的类型,例如在32位机上定义sig_atomic_t为int类型。在使用sig_atomic_t类型的变量时,还需要注意另一个问题。看如下的例子:

    #include

    sig_atomic_t a = 0;

    int main(void)

    {

    //register a sighandler

    while(!a);// wait until a changes in sighandler

    //do something after signal arrives

    return 0;

    }

    为了简洁,这里只写了一个代码框架来说明问题。在main函数中首先要注册某个信号的处理函数sighandler,然后在一个while死循环中等待信号发生,如果有信号递达则执行sighandler,在sighandler中将a改为1,这样再次回到main函数时就可以退出while循环,执行后续处理。

    如果在编译时加了优化选项,则如果第一次比较a是否为0,如果相等则成了死循环,因为不会再次从内存读取变量a的值。是编译器优化得有错误吗?不是的。设想一下,如果程序只有单一的执行流程,只要当前执行流程没有改变a的值,a的值就没有理由会变,不需要反复从内存读取,因此上面的两条指令和while(!a);循环是等价的,并且优化之后省去了每次循环读内存的操作,效率非常高。所以不能说编译器做错了,只能说编译器无法识别程序中存在多个执行流程。

    之所以程序中存在多个执行流程,是因为调用了特定平台上的特定库函数,比如sigaction、pthread_create,这些不是C语言本身的规范,不归编译器管,程序员应该自己处理这些问题。C语言提供了volatile限定符,如果将上述变量定义为volatile

    sig_atomic_t a=0;那么即使指定了优化选项,编译器也不会优化掉对变量a内存单元的读写。对于程序中存在多个执行流程访问同一全局变量的情况,volatile限定符是必要的,此外,虽然程序只有单一的执行流程,但是变量属于以下情况之一的,也需要volatile限定:变量的内存单元中的数据不需要写操作就可以自己发生变化,每次读上来的值都可能不一样;即使多次向变量的内存单元中写数据,只写不读,也并不是在做无用功,而是有特殊意义的;什么样的内存单元会具有这样的特性呢?肯定不是普通的内存,而是映射到内存地址空间的硬件寄存器,例如串口的接收寄存器属于上述第一种情况,而发送寄存器属于上述第二种情况。

    sig_atomic_t类型的变量应该总是加上volatile限定符,因为要使用sig_atomic_t类型的理由也正是要加volatile限定符的理由。对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入锁,获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。

    参考博文:https://www.cnblogs.com/my_life/articles/4313959.html谢谢原作者

    展开全文
  •  如果一个函数能被多个线程同时调用且不发生竞态,他就是线程安全的,或称为可重入的。  被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数这称为重入,访问一个全局对象,有可能因为重入而...
  • 线程安全函数的概念

    2017-11-06 09:01:00
    如果一个函数允许多个线程可重入,说明这个函数线程安全的 如果一个信号处理函数允许可重入,那么说明异步信号安全的 转载于:https://www.cnblogs.com/justart/p/7791578.html...
  • Fork-One 模型 如表 5–1 所示,pthread fork(2) 函数的行为与 Solaris fork1(2) ...但是,这两个函数都只将调用线程复制到子进程中。 当子进程直接调用 exec() 时,将调用线程复制到子进程中非常有用,大多数...
  • 线程安全函数,如果使用了静态数据或者全局数据的话,可以用锁来将其变为线程安全的。(但无论怎么样都无法变为可重入函数(或称异步信号安全函数)) 可重入函数一定是线程安全函数。反之,则不正
  • 问题源自于apue中stevens老先生有关线程安全函数的介绍,stevens有曰:如果一个函数对于多线程来说是重入的,则说这个函数是线程安全的,但这并不能说明对信号处理程序来说也是重入的。也就是说信号安全重入函数要求...
  • 在项目中经常会遇到一些需要异步处理的(耗时长)并且线程安全的对象在多线程模型中使用,封装了一个实用的线程模板,用于直接处理这类的事务。将该线程安全的对象直接绑定到单个线程上,然后将一个外部处理函数...
  • 来自:Jessica要努力了。。链接:https://www.cnblogs.com/wuchanming/p/4020184.html下文是在看csapp的时候引发的一些...可重入函数当一个被捕获的信号被一个进程处理时,进程执行的普通的指令序列会被一个信号处理...
  • 1. 异步信号安全函数又被称为可重入函数,其定义源自单线程环境: 如果一个函数可以在执行期间的任意时刻被中断,并且可以在中断服务程序中再次被安全调用,以及在中断退出后还可以继续正确执行完函数的剩下部分...
  • 首先,需要说明一下,什么是多线程安全以及异步信号安全。所谓多线程安全,我们称为MT-Safe,就是指同一个函数,同时被多个线程并行调用时,不会出现问题,也就是说,其执行结果就和该函数被串行执行多次的结果一样...
  • 异步信号安全、线程安全、可重入概念做统一对比 1. 三个概念,线程安全,可重入,信号安全  先简单提一下,  线程安全,主要是针对数据竞争来说的,就是说:如果数据不需要共享,那就让每个线程私有;...
  • printf等io函数是需要对输出缓冲区加锁,这类函数对本身是线程安全的,但是对信号处理函数来说是不可重入的(在没有返回之前,不能再次调用),即不是异步信号安全的。   对于printf这类函数,可以这样理解...
  • 线程可重入函数是可以被多个线程同时调用、且保证安全的函数,也叫做线程安全函数 信号可重入函数是在信号处理程序中保证调用安全的函数,也叫做异步信号安全函数 下图是APUE书中所说的POSIX.1中不能保证线程安全的...
  • 可重入一定是线程安全的,但是线程安全不一定是可重入的. ... 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。  使用全局变量的函数是非线程安全的。  
  • 在多线程或有异常控制流的情况下,当某个函数运行到中途时,控制流(也就是当前指令序列)就有可能被打断而去执行另一个函数. 如果在这种情况下不会出现问题,比如说数据或状态不会被破坏,行为确定。那么这个函数就被...
  • 1. 三个概念,线程安全,可重入,信号安全  先简单提一下,  线程安全,主要是针对数据竞争来说的,就是说:如果数据不需要共享,那就让每个线程私有;如果需要共享,那就加锁。  信号安全,其实也就是...
  • 可重入函数 当一个被捕获的信号被一个进程处理时,进程执行的普通的指令序列会被一个信号处理器暂时地中断。它首先执行该信号处理程序中的指令。如果从信号处理程序返回(例如没有调用exit或longjmp),则继续执行在...
  • 可重入与异步信号安全一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻...有人将可重入函数与线程安全函数混为一谈,我认为是不正确的。这里引用CSAPP中的描述来说明一下:...
  • 一个可重入函数简单来说是可以被中断的函数,也就是说,可以在这个函数运行的任何时候中断它,转入os调度下去执行另一段代码,而返回控制时不会出现什么错误。 ...有一类重要的线程安全函数,叫做

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 430
精华内容 172
关键字:

异步线程安全函数