当前位置:首页 > 技术知识 > 正文内容

关于异步信号安全(下面关于异步电路危害的描述错误的是)

maynowei2周前 (08-03)技术知识10

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

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

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

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;
}

相关文章

单打独斗的产品设计师工作流程总结

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。我从入行开始就在一个做自己产品的小公司工作,到现在已经三年了。刚开始工作的时候什么也不懂,老板说让出效果图,就开始直接...

2018年度回顾:挖矿木马为什么会成为病毒木马黑产的中坚力量

一、概述根据腾讯御见威胁情报中心监测数据,2018年挖矿木马样本月产生数量在百万级别,且上半年呈现快速增长趋势,下半年上涨趋势有所减缓。由于挖矿的收益可以通过数字加密货币系统结算,使黑色产业变现链条十...

真来了,iOS 16.6 beta 利用,隐藏 Dock 栏

昨天提到!iOS 16.5 kfd 漏洞可以隐藏 Dock 栏消息,现在已经确定 iOS 16.6 beta 内测也是支持使用 kfd 漏洞,当然!也是支持隐藏 Dock 栏,主要验证该系统是否可用。...

Android让视图折叠(安卓叠加视图设置)

Android UI Libs之ExpandableLayout1. 说明ExpandableLayout,顾名思义,可扩展的布局,是一个可以帮助我们实现折叠功能的第三方库,折叠时,只显示头部,打开时...

Android TabLayout + ViewPager2使用

1、xml文件<!--明细列表--> <com.google.android.material.tabs.TabLayout android:id="@+id/ty_...

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...