zoukankan      html  css  js  c++  java
  • 关于异步信号安全

    关于异步信号安全

    线程安全与重入以及异步信号安全的区别.

    可重入一定是线程安全的,但是线程安全不一定是可重入的.

    引用别人的博客中的话吧.如下:

    http://blog.csdn.net/xiaofei0859/article/details/5818511

     线程安全:
          
    线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。
                        
    使用全局变量的函数是非线程安全的。
                        
    使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。

           线程安全的(Thread-Safe)
                      
    如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。
                      
    线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。

           可重入(Reentrant)
                      
    函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重  入性解决函数运行结果的确定性和可重复性。


    可重入函数编写规范为:

    1、不在函数内部使用静态或全局数据 
    2
    、不返回静态或全局数据,所有数据都由函数的调用者提供。 
    3
    、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
    4
    、如果必须访问全局变量,利用互斥机制来保护全局变量。
    5
    、不调用不可重入函数。

    两者之间的关系:
    1
    、一个函数对于多个线程是可重入的,则这个函数是线程安全的。
    2
    、一个函数是线程安全的,但并不一定是可重入的。【使用互斥锁实现的线程安全】
    3
    、可重入性要强于线程安全性。

    具体看代码,这里的thread_safe_not_reentrant就是一个例子,请忽略printf调试函数,我没有查这个函数的重入特性。

    请在运行以后按下ctrl c,观察程序死锁。

    #include <stdio.h>		/* for convenience */
    #include <stdlib.h>		/* for convenience */
    #include <unistd.h>		/* for convenience */
    #include <signal.h>		/* for SIG_ERR */
    #include <pthread.h>
    
    pthread_mutex_t env_mutex;
    void thread_safe_not_reentrant(char *name){
        printf("call from %s
    ",name);
        pthread_mutex_lock(&env_mutex);
        sleep(5);
        pthread_mutex_unlock(&env_mutex);
        printf("return from %s
    ",name);
    }
    static void
    sig_int(int signo)
    {
        printf("caught SIGINT
    ");
        thread_safe_not_reentrant("sig int ");
    }
    
    
    
    int
    main(void)
    {
        //if default mutex ,it use recursive , will not deadlock
        //env_mutex=PTHREAD_MUTEX_INITIALIZER;
        pthread_mutexattr_t attr;
        pthread_mutexattr_init(&attr);
        pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_NORMAL);
        pthread_mutex_init(&env_mutex,&attr);
        pthread_mutexattr_destroy(&attr);
        if (signal(SIGINT, sig_int) == SIG_ERR)
            printf("signal(SIGINT) error");
        thread_safe_not_reentrant("main");
        return 0;
    }
    

      

  • 相关阅读:
    math.js:灵活强大的JavaScript数学库
    math.js:灵活强大的JavaScript数学库
    math.js:灵活强大的JavaScript数学库
    前端开发必须要了解的CSS原理
    前端开发必须要了解的CSS原理
    前端开发必须要了解的CSS原理
    GET和POST有什么区别?
    GET和POST有什么区别?
    GET和POST有什么区别?
    ACM2026
  • 原文地址:https://www.cnblogs.com/baizx/p/5128862.html
Copyright © 2011-2022 走看看