1. 程式人生 > >linux執行緒退出的方式及執行緒資源清理

linux執行緒退出的方式及執行緒資源清理

關鍵詞:執行緒資源釋放, pthread_join()

1, 每個執行緒有自己的一組暫存器,自己的棧空間, 自己的errno變數;

2,pthread_create執行緒建立並不能保證哪個執行緒先執行,新執行緒還是呼叫執行緒。

3,執行緒正常退出的方式有三種: 執行緒函式直接return, 被同一程序中的其他執行緒呼叫pthread_cancel取消,執行緒呼叫pthread_exit 退出,(執行緒執行異常退出)。

4,不論是可預見的執行緒終止還是異常終止,都會存在資源釋放的問題,在不考慮因執行出錯而退出的前提下,如何保證執行緒終止時能順利的釋放掉自己所佔用的資源,特別是鎖資源,就是一個必須考慮解決的問題,https://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part4/ 一文中介紹了pthread_cleanup_push()/pthread_cleanup_pop()解決資源釋放問題,因為沒有用到,不寫在這裡,對於異常退出的情況,注意在每個退出的點上都加上資源,尤其是鎖資源的釋放。

5,對於執行緒正常退出的資源釋放,根據執行緒的屬性,有兩種方式: 對於屬性為joinable的(預設),執行緒所佔用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放對於屬性為detached分離狀態的,執行緒在結束執行時自行釋放所佔用的記憶體資源。

6,把執行緒置為detached屬性有兩種方式,一種是線上程建立時設定屬性pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);另一種是呼叫pthread_detach()使執行緒成為detached,就可以自動釋放資源了。

7,對於屬性為joinable的執行緒,可以通過呼叫pthread_detach()將其屬性改變為detached, 但是屬性為detached的執行緒,不能改回joinable屬性, 也就是不能呼叫pthread_join()釋放資源。

8,如果執行緒pthread_detach()執行之後,對執行緒請求pthread_join()將返回錯誤,如果執行緒已經被呼叫pthread_join()後,再呼叫pthread_detach()就不會有任何效果。

9,一個可join的執行緒所佔用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放,因此為了避免記憶體洩漏,所有執行緒的終止,要麼已設為DETACHED,要麼就需要使用pthread_join()來回收

10,pthread_join()函式:以阻塞的方式等待thread指定的執行緒結束。當函式返回時,被等待執行緒的資源被收回。如果執行緒已經結束,那麼該函式會立即返回。並且thread指定的執行緒必須是joinable的。

相關推薦

linux執行退出方式執行資源清理

關鍵詞:執行緒資源釋放, pthread_join() 1, 每個執行緒有自己的一組暫存器,自己的棧空間, 自己的errno變數; 2,pthread_create執行緒建立並不能保證哪個執行緒先執行,新執行緒還是呼叫執行緒。 3,執行緒正常退出的方式有三種: 執行緒函式直

Linux執行退出方式總結

在編寫多執行緒程式碼時,經常面臨執行緒安全退出的問題。 一般情況下,選擇檢查標誌位的方式: 線上程的while迴圈中,執行完例程後,都對標誌位進行檢查,如果標誌位指示繼續執行則再次執行例程,如果標誌位設定為退出狀態,則跳出迴圈,結束執行緒的執行。 這個標誌

建立執行方式實現

優勢是:執行緒類只是實現了 Runnable 介面或 Callable 介面,還可以繼承其他類。在這種方式下,多個執行緒可以共享同一個 target 物件,所以非常適合多個相同執行緒來處理同一份資源的情況,從而可以將 CPU、程式碼和資料分開,形成清晰的模型,較好地體現了面向物件的思想。 劣勢是:程式設計稍

執行退出方式:pthread_exit(NULL)和return的區別

pthread_exit()用於執行緒退出,可以指定返回值,以便其他執行緒通過pthread_join()函式獲取該執行緒的返回值 return,是函式返回,不一定是執行緒函式哦! 只有執行緒函式return,執行緒才會退出 exit()是程序退出,如果線上

linux執行基本概念執行控制

文章目錄 1.初識執行緒 1)執行緒的概念 2)程序與執行緒的關係 3)程序的多個執行緒共享 4)執行緒的優點 5)執行緒的缺點 6)執行緒異常情況 2.執行緒控制

ThreadPoolTaskExecutor多執行使用,執行池配置

1.配置 ThreadPoolTaskExecutor bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

Linux執行shell指令碼方式區別&命令後臺執行

假設shell指令碼檔案為hello.sh 放在/root目錄下。下面介紹幾種在終端執行shell指令碼的方法: [[email protected] home]# cd /root/ [[email protected] ~]#vim hello.s

執行中的確保子執行退出之後 主執行退出

 Linux下程式設計,執行緒、程序退出順序問題紛紛擾擾,如果父程序/執行緒先於子程序/執行緒終止,系統會做什麼處理呢?反之,如果子程序/執行緒先於父程序/執行緒終止,系統又會做什麼處理呢?下面是我個人平時在筆記上做的一些象徵性的總結,如果有疑問之處,大可提出,我一直認

Java 執行安全問題執行鎖(讀書筆記)

多執行緒安全問題: 首先整理多執行緒同步的知識點,開頭肯定是要先探討探討多執行緒安全的問題。那麼嘛叫執行緒安全問題呢? 答: 我們知道Jvm虛擬機器的設計中執行緒的執行是搶佔式的,執行緒的執行時間是由底層系統決定的。所以就會有多個執行緒修改同一個資料時不同

Java多執行——實現執行方式以及執行的狀態

什麼是執行緒 執行緒是程序中獨立執行的子任務(程序是受作業系統管理的基本執行單元),在沒有同步的情況下,執行緒的執行是隨機亂序的。 在Java程式設計中,有四種方式去實現多執行緒。 一、實現Runnable介面 Runnable介面中只

執行——執行實現方式執行屬性

程序和執行緒 程序是計算機系統中能獨立執行並作為資源分配的基本單位,它是由PCB(程序控制塊),資料段和程式碼段組成,是一個能獨立執行的基本單位.程序的建立,排程,分派都需要較大的時間和空間開銷,在作業系統中引入執行緒,以執行緒作為排程和分派的基本單位,以此來改進多處理機系統的效能 執行緒是作業系統能夠進行運

一起分析執行的狀態執行通訊機制

> 本文在個人技術部落格同步釋出,詳情可[**用力戳**](http://www.17coding.info/article/27) > 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩...   多執行緒程式設計一直是普通程式設計師進階為高階程式設計師的必備技

回到上次目錄、歷史命令查找快捷方式執行時間顯示設置、查看系統版本

如何 cnblogs 尋找 long 9.png etc 執行時間 mage 內核 一、回到上次操作的目錄 # cd -進入上次訪問目錄 二、歷史命令搜索操作快捷鍵: [Ctrl + r], [Ctrl + p], [Ctrl + n]在終端中按捉 [Ctrl] 鍵的同時

js中頁面加載完成後執行的幾種方式執行順序

class 事件 兩種 在哪裏 log 等待 沒有 cti 完成 1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前兩者本質上沒有區別,第1種是第2種的簡寫方式。兩個是document

Linux下Mysql的安裝執行(詳解)

1、組及使用者建立: sudo groupadd mysql #新增組 sudo useradd -r -g mysql mysql #新增所建立組下的使用者 2、官方下載網址 wget http://downloads.mysql.com/archives/get/file/mysql-5

青蛙學Linux—系統初始化init執行

Linux系統的啟動首先從BIOS開始,接下來Linux的載入程式將核心映像載入到記憶體,進行核心初始化。在核心初始化的最後一步,就是啟動PID為1的init程序,這個程序是系統的第一個程序,負責啟動那些開機時需要啟動的服務。 大多數的Linux發行版的init系統都是和System V相容的,所以也被稱為

linux下編譯、連線執行時環境變數設定(boost庫為例)

以boost庫的存放目錄/usr/boost為例, 開啟/etc/profile, 追加以下內容(前兩行為編譯時路徑): export CPLUS_INCLUDE_PATH=/usr/boost/include:$CPLUS_INCLUDE_PATH export LIB

js中頁面載入完成後執行的幾種方式執行順序

在js和jquery使用中,經常使用到頁面載入完成後執行某一方法。通過整理,大概是五種方式(其中有的只是書寫方式不一樣)。 1:使用jQuery的$(function){};2:使用jquery的$(document).ready(function(){});前兩者本質上沒

檢視linux的ssh服務資訊執行狀態

下面列舉一些關於linux檢視ssh服務的常用命令 rpm -qa | grep ssh 可以看到系統中ssh安裝包    ps -ef | grep ssh檢視ssh服務有沒有執行,如果有,可以看到

netcore一鍵部署到linux伺服器以服務方式後臺執行

  AntDeploy 是我開發一款開源一鍵釋出外掛 將本地vs中的程式碼,一鍵打包,部署到任意的遠端伺服器 部署方式支援 windows服務,linux服務,docker容器,iis 支援增量釋出(只更新有修改的) 支援一鍵回滾(出了問題快速恢復) 支援檢視釋出歷史記錄 AntDeploy