PHP在默認的情況下是不支持多線程的,通過安裝pthreads擴展,讓其參數(shù)來指定編譯PHP的線程安全方式來使其支持多線程,但是使用的過程中要考慮到線程安全的問題。
線程是操作系統(tǒng)中進行運算調(diào)度的最小單位。它被包含在進程中,是進程中的實際運作單位。今天將要分享的是線程知識是有關(guān)于PHP的,具有一定的參考價值,希望對大家有所幫助
多線程的理解
所謂多線程就是在在一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。多線程大大提高了程序的執(zhí)行效率,一個多線程比單線程被操作系統(tǒng)調(diào)度的概率更大。而且更高效。多個線程可以在多核CPU的多個核心同時運行,加快了運行效率。而且線程間的通信更加簡單。
PHP多線程
在默認情況下PHP是不支持多線程的,要使用多線程需要安裝 擴展,目前常用的擴展有pcnlt,POSIX ,pthreads,但是用的最多的還是pthreads擴展,它通過使用參數(shù)來指定來編譯PHP時的線程安全方式,使其支持多線程。
在使用線程之前首先要考慮到線程的安全問題,線程安全指的是某個函數(shù)或函數(shù)庫在多線程環(huán)境中被調(diào)用時,能夠正確的處理多線程之間的共享變量,使得程序的功能能夠正確完成
例:在多線程中由于存在共享變量,很有可能會導致出現(xiàn)以下問題:
存在一個全局數(shù)組:$arr = array('a');
A 線程獲取數(shù)組長度為1;
B 線程獲取數(shù)組長度為1;
A 線程pop出數(shù)組元素 $a = array_pop($arr); $a = 'a';
B 線程也pop數(shù)組元素 $b = array_pop($arr); $a = null;
但是此時B線程內(nèi)就出現(xiàn)了錯誤事件,雖設(shè)置了數(shù)組長度大于0,但是沒有 pop值來
PHP實現(xiàn)線程安全
PHP實現(xiàn)線程安全主要通過 TSRM 機制,通過此機制可以對全局變量和靜態(tài)變量進行隔離,并且給每個線程都復制了一份全局變量和靜態(tài)變量。各個線程使用的都是主線程的一個備份。這樣就避免了變量沖突,也不會發(fā)生線程安全的問題。
PHP 對多線程的封裝保證了線程安全,所以開發(fā)人員就不需要在考慮讀寫沖突的問題了,也使得代碼更加安全。不過這樣做也有不好的地方,例如當子線程開始運行時,主線程便再也無法對子線程運行細節(jié)進行調(diào)整了,失去了消息傳遞能力
總結(jié):以上就是本篇文章的全部內(nèi)容了,希望對大家有所幫助。
新聞熱點
疑難解答