PHP7核心剖析10之線程安全
這篇文章的內容介紹的是關於PHP7核心剖析10之線程安全,現在分享給大家,有需要的朋友可以參考一下
1.線程安全資源管理器
PHP的SAPI多數是單線程環境,例如cli、fpm、cgi,每個行程只啟動一個主線程,這種模式下是不存在線程安全問題的,但是也有多線程的環境,例如Apache,這種情況下就需要考慮線程安全的問題了,因為PHP中有很多全局變量,比如最常見的:EG、CG,如果多個線程共享同一個變量將會衝突,所以PHP為多線程的應用模型提供了一個安全機制:Zend線程安全(Zend Thread Safe, ZTS)。
PHP中專門為解決線程安全的問題抽像出了一個線程安全資源管理器(Thread Safe Resource Mananger, TSRM),實現原理比較簡單:既然共用資源這麼困難那麼就乾脆不共用,各執行緒不再共享同一份全域變量,而是各複製一份,使用資料時各執行緒各取自己的副本,互不干擾。
typedef struct { size_t size; //资源的大小 ts_allocate_ctor ctor; //初始化函数 ts_allocate_dtor dtor; int done; } tsrm_resource_type; struct _tsrm_tls_entry { void **storage; //资源数组 int count; //拥有的资源数:storage数组大小 THREAD_T thread_id; //所属线程id tsrm_tls_entry *next; };
如果一個資源會被多執行緒使用,那麼首先需要預先向TSRM註冊資源,然後TSRM為這個資源分配一個唯一的編號,並把這種資源的大小、初始化函數等保存到一個tsrm_resource_type結構中,各線程只能透過TSRM分配的那個編號訪問這個資源;然後當線程拿著這個編號獲取資源時TSRM如果發現是第一次請求,則會根據註冊時的資源大小分配一塊內存,然後呼叫初始化函數進行初始化,並把這塊資源保存下來供這個執行緒後續使用。
每個執行緒擁有一個tsrm_tls_entry結構,目前執行緒的所有資源都保存在storage陣列中,下標就是各資源的id。另外所有執行緒的tsrm_tls_entry結構透過一個陣列保存:tsrm_tls_table,這是個全域變數,每個執行緒的tsrm_tls_entry結構在這個陣列中的位置是根據執行緒id與預先設定的執行緒數(tsrm_tls_table_size)取模得到的,也就是說有可能多個執行緒保存在tsrm_tls_table同一位置,所以tsrm_tls_entry是個鍊錶,在尋找資源時先根據:執行緒id % tsrm_tls_table_size得到一個tsrm_tls_entry,然後開始遍歷鍊錶比較thread_id確定是否是目前執行緒的。線程本地存儲(Thread Local Storage, TLS),在創建完當前線程的tsrm_tls_entry後會把這個值保存到當前線程的TLS中,這樣在ts_resource()獲取資源時中就可以透過tsrm_tls_get()直接取到了,節省加鎖檢索的時間。
#相關推薦:
##
以上是PHP7核心剖析10之線程安全的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。
