[Linux]線程安全和可重入函數

線程安全:一個函數被稱為線程安全的,當且僅當被多個并發進程反復調用時,它會一直產生正確的結果。如果一個函數不是線程安全的,我們就說它是線程不安全的。

重入:函數被不同的控制流程調用,有可能在第一次調用還沒返回時就再次進入該函數;

不可重入函數:函數訪問一個全局鏈表,有可能因為重入而造成錯亂;

可重入函數:如果一個函數只訪問自己的局部變量或參數;

可重入函數避免了因訪問其他的函數而造成的線程不安全問題。可重入函數為線程安全的函數。

像全局鏈表一樣,可能因為線程的問題同時頭插倆個節點而導致的插入錯誤,這就造成線程的不安全,因為其操作不是原子操作,進而導致同一時刻發生不同的動作。
這里寫圖片描述
像上述的例子,就有可能發生因為重入而導致的錯亂,這樣的就稱為不可重入函數。

我們知道,重入函數是線程安全函數。如果一個函數對多個線程來說時可重入的,就說這個函數時線程安全的。但這并不能說明對信號處理程序來說該函數也是可重入的。如果函數對異步信號處程序的重入是安全的,那么就說這個函數是異步信號安全的。

總的來說,可重入函數是線程安全函數,但是線程安全函數不一定是可重入函數。

用幅圖來表示一下吧~

這里寫圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382700.shtml
英文地址,請注明出處:http://en.pswp.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…