关于异步信号安全

简介: 关于异步信号安全 线程安全与重入以及异步信号安全的区别. 可重入一定是线程安全的,但是线程安全不一定是可重入的. 引用别人的博客中的话吧.如下: http://blog.csdn.net/xiaofei0859/article/details/5818511  线程安全:       线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。

关于异步信号安全

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

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

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

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\n",name);
    pthread_mutex_lock(&env_mutex);
    sleep(5);
    pthread_mutex_unlock(&env_mutex);
    printf("return from %s\n",name);
}
static void
sig_int(int signo)
{
    printf("caught SIGINT\n");
    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;
}

  

目录
相关文章
|
4月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
10月前
|
设计模式 Unix Shell
ECF机制:信号 (Signal)
ECF机制:信号 (Signal)
150 0
|
3天前
|
Linux 程序员 API
信号的机制——信号处理函数的注册
【9月更文挑战第17天】在 Linux 系统中,信号用于响应各种事件,可通过 `kill -l` 查看所有信号。每个信号有唯一 ID 及默认操作,如终止(Term)或生成核心转储(Core)。进程可执行默认操作、捕获信号或忽略信号,但无法忽略 SIGKILL 和 SIGSTOP。常用 `signal` 或 `sigaction` 函数注册信号处理函数,后者更灵活且推荐使用。信号处理涉及系统调用和内核设置,建议根据需求定制参数。
|
4月前
|
存储
【进程信号】信号阻塞的原理
【进程信号】信号阻塞的原理
|
3月前
|
Java
java线程之信号同步
java线程之信号同步
|
4月前
|
NoSQL Linux Shell
【进程通信】了解信号以及信号的产生
【进程通信】了解信号以及信号的产生
|
4月前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
Linux
Linux 进程信号的基本概念、信号类型、信号处理方式、信号传递机制以及如何使用进程信号进行进程间通信、异常处理
Linux 进程信号的基本概念、信号类型、信号处理方式、信号传递机制以及如何使用进程信号进行进程间通信、异常处理
539 0
时钟的同步与异步问题
时钟的同步与异步问题,是一个很基础,但是很常见的问题,本文简单总结笔者理解的相关问题,用于对时钟之间同步异步问题进行简单的判断。
447 0
|
Linux Shell API
linux基础——信号阻塞及未决信号
linux基础——信号阻塞及未决信号
139 0
linux基础——信号阻塞及未决信号