博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于异步信号安全
阅读量:6566 次
发布时间:2019-06-24

本文共 1772 字,大约阅读时间需要 5 分钟。

关于异步信号安全

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

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

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

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 
/* for convenience */#include
/* for convenience */#include
/* for convenience */#include
/* for SIG_ERR */#include
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 voidsig_int(int signo){ printf("caught SIGINT\n"); thread_safe_not_reentrant("sig int ");}intmain(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;}

  

你可能感兴趣的文章
【Leetcode】Search in Rotated Sorted Array
查看>>
redis3.0.0 集群安装详细步骤
查看>>
FutureTask——另一种闭锁的实现
查看>>
Linux 用户和用户组管理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>
基于php5.5使用PHPMailer-5.2发送邮件
查看>>
InstallShield 2012 Spring新功能试用(16): Suite/Advanced UI 或 Advanced UI安装程序能在安装时进行输入合法性校验与反馈...
查看>>
C#面试宝典
查看>>
基金项目的英文
查看>>
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
ios 字典转模型
查看>>
Java类集
查看>>
类的生命周期
查看>>
php apache用户写文件夹权限设置
查看>>
浅析rune数据类型
查看>>
普通用户开启AUTOTRACE 功能
查看>>
游侠原创:推荐一款免费的Syslog转发工具
查看>>
onAttachedToWindow和onDetachedFromWindow调用时机源码解析
查看>>
根据Servlet的Filter自定义实现字符编码过滤器
查看>>