搜尋
首頁後端開發php教程Linux--線程的控制與分離

一、執行緒的概念
執行緒是進程內部的一個基本執行流,是系統調度的一個實體。進程具有獨佔性,執行緒具有共享性。各執行緒共享程序的檔案描述符、訊號處理的方式、目前的工作目錄、使用者id(uid)和群組id(gid)。但有些資源執行緒是私有的,例如執行緒id、堆疊空間、上下文(包括各種暫存器的值。程式計數器和堆疊指標)、佔空間、訊號屏蔽字、調度優先權。就好比進程如果是一個家庭的話,線程就是這個家庭的成員,每個家庭的成員都有一個公共的空間(餐廳,客廳)。當然每個家庭成員也有自己的私人空間了。

二、執行緒的控制
創建執行緒和終止
用函數pthread_create()創建,成功回傳0,失敗返歸錯誤號碼。呼叫 pthread_create()建立新的執行緒後。當前執行緒從pthread_create()返回繼續往下執行。新的線程所執行的程式碼由函數指標start_routine決定。函數start_routine函數接收一個參數,是透過pthread_create()的arg傳給它的。類型為void*,start_toutine的回傳值型別也是void*,start_toutine回傳後,這個執行緒就退出了,其他執行緒可以呼叫pthread_join()得到start_toutine的回傳值。 start_toutine函數可以透過①return(void*)、②pthread_exit(void*)、③pthread_cancel(pthread_self())三種終止。

 #include<stdio.h>  
  2 #include<pthread.h>  
  3 void * thread_run(void* arg)  
  4 {  
  5     int count=5;  
  6     while(1)  
  7     {  
  8         printf("this is a thread,thread id is\n"pthread_self());  
  9         sleep(1);  
 10     }  
 11     //return (void*)1;  
 12     //pthread_exit((void*)2);  
 13     // pthread_cancel(pthread_self());  
 14 }  
 15 int main()  
 16 {  
 17     pthread_t id;  
 18     int ret=pthread_create(&id,NULL,thread_run,NULL);  
 19     int count=10;  
 20     while(count-->0)  
 21     {  
 22         printf("this is a main thread,thread id is %u\n",pthread_self());  
 23         sleep(1);  
 24     }  
 25     void * ted=0;  
 26     pthread_cancel(id);  
 27     pthread_join(id,&ted);  
 28     printf("return success %d\n",(int)ted);  
 29 }

Linux--線程的控制與分離

可以看出:
1、如果透過return返回。 pthread_join接收的值是執行緒的回傳值

2、如果執行緒被別的執行緒呼叫pthread_cancel異常終止掉。則回傳錯誤碼

3、如果是呼叫pthread_exit終止的。 pthread_join存放的是傳給pthread_exit的參數。

4、兩個執行緒的執行緒號碼是不一樣的

三、執行緒分離
執行緒在任一個時間點。是可結合的(joinable)或是可分離的(detached)。可結合的線程可被其他的線程回收資源和殺死。在被其他執行緒回收之前,它的記憶體資源是不釋放的。而可分離的執行緒是不能被其他回收或殺死的,它的記憶體資源在它終止時由系統自動釋放。預設情況下。線程被創建成可結合的。為了避免記憶體洩漏,每個可結合的執行緒都應該要么被顯示的回收,即調用pthread_join;要么通過pthread_detach函數分離。
如果如果一個可結合線程結束運行但沒有被pthread_join,則它的狀態類似於進程中的殭屍進程,即還有一部分資源沒有被回收,所以創建線程者應該調用pthread_join來等待線程運行結束,並可得到執行緒的退出程式碼,回收其資源。呼叫pthread_join後,如果該執行緒沒有運行結束,呼叫者會被阻塞。這是可以在子執行緒中加入程式碼pthread_detach(pthread_self())或父執行緒呼叫pthread_detach(thread_id)非阻塞,可立即傳回。這將該子執行緒的狀態設為分離的(detached),如此一來,該執行緒運行結束後會自動釋放所有資源。

1 #include<stdio.h>  
  2 #include<pthread.h>  
  3 void* thread_run(void* arg)  
  4 {  
  5     pthread_detach(pthread_self()); //分离线程  
  6     printf("this is a thrad \n");  
  7     return (void*)1;  
  8 }  
  9 int main()  
 10 {  
 11     pthread_t id;  
 12     int ret= pthread_create(&id,NULL,thread_run,NULL);  
 13     printf("this is a main thread\n");  
 14     sleep(1);  
 15   
 16     int res=pthread_join(id,NULL);  
 17     if(res==0)  
 18     {  
 19         printf("pthrad wait succced\n");  
 20         return 0;  
 21     }  
 22     else  
 23     {  
 24         printf("pthread wait faile\n");  
 25         return 1;  
 26     }  
 27     return 0;  
 28 }

Linux--線程的控制與分離

如果把子執行緒中的pthread_detach(pthread_self())註解掉,則結果如下,這是因為把子執行緒中分開去掉後,其他執行緒就可以對子執行緒進程join和殺死,然後釋放掉記憶體資源。而上面是因為在子進程中已經分離的,所以其他線程不能在對其訪問了,join返回fail

Linux--線程的控制與分離

總結:
線程的控制從創建線程-->子線程的三種終止方式- ->其他線程join線程。終止的方式不同,join的回傳值就不同。線程的分離,如果子線程中加入pthread_detach()就把子線程設定成了可分離的線程,線程退出後會自動釋放記憶體資源,不會造成記憶體洩漏。如果不設定的話,就要用join顯示接收,然後釋放資源,也不會造成記憶體洩漏。

以上是Linux--線程的控制與分離的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境