网站首页 > 技术文章 正文
线程安全与重入以及异步信号安全的区别.
可重入一定是线程安全的,但是线程安全不一定是可重入的.
引用别人的博客中的话吧.如下:
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; }
- 上一篇: C++ 编程中的一些最佳实践
- 下一篇: Qt QWaitCondition 的正确使用方法
猜你喜欢
- 2025-05-15 穿透与击穿:缓存世界的两场“攻击”,Java工程师如何见招拆招?
- 2025-05-15 一篇文章快速搞懂C++线程同步机制
- 2025-05-15 C语言编写多线程,什么时候要使用互斥锁?为什么要使用互斥锁?
- 2025-05-15 go语言并发原语RWMutex实现原理及闭坑指南
- 2025-05-15 实战经验:一次错误使用 go-cache 包导致出现的线上问题
- 2025-05-15 3. 复合数据类型
- 2025-05-15 Linux ALSA 音频系统:物理链路篇02
- 2025-05-15 聊聊并发编程: Lock
- 2025-05-15 Golang语言如何实现并行和并发
- 2025-05-15 C++防御性编程,提高代码的健壮性
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- python编写软件 (14)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- dfn (14)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)