[Linux]线程安全和可重入函数

线程安全:一个函数被称为线程安全的,当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的。

重入:函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数;

不可重入函数:函数访问一个全局链表,有可能因为重入而造成错乱;

可重入函数:如果一个函数只访问自己的局部变量或参数;

可重入函数避免了因访问其他的函数而造成的线程不安全问题。可重入函数为线程安全的函数。

像全局链表一样,可能因为线程的问题同时头插俩个节点而导致的插入错误,这就造成线程的不安全,因为其操作不是原子操作,进而导致同一时刻发生不同的动作。
这里写图片描述
像上述的例子,就有可能发生因为重入而导致的错乱,这样的就称为不可重入函数。

我们知道,重入函数是线程安全函数。如果一个函数对多个线程来说时可重入的,就说这个函数时线程安全的。但这并不能说明对信号处理程序来说该函数也是可重入的。如果函数对异步信号处程序的重入是安全的,那么就说这个函数是异步信号安全的。

总的来说,可重入函数是线程安全函数,但是线程安全函数不一定是可重入函数。

用幅图来表示一下吧~

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux]信号量

信号量是一个计数器,用于为多个进程提供对共享数据对象的访问。 在信号量上只有三种操作可以进行,初始化、递增和增加,这三种操作都是原子操作。递减操作可以用于阻塞一个进程,增加操作用于解除阻塞一个进程。 为了获得共享资源…

Linux VIM 程序中有游离的‘\357’ ‘\274’错误

gcc date.cpp -o date -lstdc date.cpp:18:20: 错误:程序中有游离的‘\357’date.Showdata()���^ date.cpp:18:21: 错误:程序中有游离的‘\274’date.Showdata()���^ date.cpp:18:22…

[Linux]关于SIGCHLD

之前我们就学过,关于wait和waitpid来处理僵尸进程,父进程等待子进程结束后自己才退出,这样的方法有俩种方式,一种是父进程死死的等子进程退出,也就是使用阻塞的方式等待子进程退出,另一种方式是通过非阻塞的…

C语言思维导图

本人能力有限,知识点难免概括不全,如有错误欢迎指正

转载一篇关于curl的文章

转载一篇关于curl的文章 http://www.360doc.com/content/16/0107/15/18578054_526158476.shtml

[Linux]vi/vim下添加多行注释和取消注释

添加注释(Centos): 在命令行模式下按ctrlV进入 visual block模式(可视化模式) 选中你需要注释的行,再按大写的I,输入//,最后按俩下esc即可。 如果想让前进tab个位,则可在…

pthread和互斥量条件变量函数意义速查表

数据类型 pthread_t 线程 互斥量和条件变量

[Linux]共享内存

共享内存是UNIX提供的进程间通信手段中速度最快的一种,也是最快的IPC形式。为什么是最快的呢,因为数据不需要在客户进程和服务器进程之间复制,所以是最快的一种IPC。这是虚存中由多个进程共享的一个公共内存块。 两个不同进程A、B共享内存的…

僵尸进程的产生,危害和解决方案

概念 僵死状态(Zombies)是一个比较特殊的状态。 当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出&…

CString string 转换

https://www.cnblogs.com/HappyEDay/p/7016162.html

[Linux]gdb调试多进程多线程例程

gdb相信学linux的同学已经比较熟悉了吧,它是linux下代码调试工具。我们在写c语言,c的代码时经常会用到,它有一些常用的调试命令: run(r):运行程序,如果有断点在下一个断点处停止 start&#xf…

gdb调试常用命令速查(段错误调试)

编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main gdb中命令: 回车键:重复上一命令 (gdb)help:查看命令帮助,具体命令查询在gdb中输入help 命令,简写h &…

C语言字符串 小记

#include "stdafx.h" #include <iostream> #include <string.h> using namespace std;int _tmain(int argc, _TCHAR* argv[]) {char str1[] "12345"; // ""括起来的字符串 会在末尾增加 \0 cout << sizeof(str1) << en…

[Linux]守护进程(精灵进程)

一、守护进程是什么 守护进程是生存期很长的一种进程&#xff0c;可以说它是7*24小时工作的。&#xff08;什么是7*24&#xff0c;一周7天&#xff0c;每天24小时&#xff0c;这不就是一年365天一直在工作嘛&#xff0c;还搞的这么诙谐&#xff0c;哈哈&#xff09;。它们常常…

linux命令行界面下ctrl 常用组合键速查表

Ctrlz 暂停正在运行的程序 Ctrll 清屏 Ctrld 结束输入或退出shell Ctrla 切换到命令行开始 Ctrle 切换到命令行末尾 Ctrlu 删除光标前内容 Ctrlk 删除光标后内容 Ctrlxu 撤销操作

[Linux]运输层的端口

既然提到端口&#xff0c;我们就来分析一下为什么要使用端口的缘由吧。我们首先要知道的是&#xff0c;运输层有复用和分用的功能。应用层所有的应用进程都可以通过运输层再传送到IP层&#xff0c;这就是复用。运输层从IP层收到数据后必须交付到指明的应用进程&#xff0c;这就…

浅谈shell中的clear命令实现

NAME(名称) clear - 清除终端屏幕 SYNOPSIS(总览) clear DESCRIPTION(描述) clear可以在允许的情况下清屏. 它会在环境变量中查找终端的类型, 然后到terminfo数据库中找出清屏的方法. 《man手册》 #include <stdio.h>int clear_main(int argc, char **argv) {/* Th…

C++ 对引用的理解

引用可以看做是数据的一个别名&#xff0c;通过这个别名和原来的名字都能够找到这份数据引用必须在定义的同时初始化&#xff0c;并且以后也要从一而终&#xff0c;不能再引用其它数据&#xff0c;这有点类似于常量&#xff08;const 变量&#xff09;。引用变量 里面 实际存储…

[Linux]ARP协议

概念&#xff1a; 1. ARP协议(地址解析协议):由IP地址转换为MAC地址的协议。IP地址&#xff1a;网络号主机号。MAC地址&#xff1a;数据链路层的物理地址&#xff08;硬件地址&#xff09;。IP协议使用了ARP协议&#xff0c;因此被划归为网络层&#xff0c;但其用途是从网络层…

Makefile使用及多文件gdb 调试

文件内容 [koulocalhost makefile]$ cat 1.c #include "3.h" int main() {key_t key ftok(".",1);printf("%d\n",add(1,2));return 0; }[koulocalhost makefile]$ cat 2.c #include "3.h" int add(int a, int b) {return a b; } [k…