1. 程式人生 > >php多執行緒pthread詳解

php多執行緒pthread詳解

**執行緒(thread):
作業系統能夠進行運算排程的最小單元,包含在程序中,是程序的實際運算單位。
一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行多個任務。

一個多執行緒程式比單執行緒被程式呼叫的概率更大,所以多執行緒一般會比單執行緒程式更加高效。
多執行緒程式的多個執行緒可以在多核CPU的多個核心執行,完全發揮多核cpu的優勢。

特點:
執行緒的建立和切換的系統開銷都比程序小,所以一定程度上會比多程序更加高效。
執行緒天生共享記憶體空間,執行緒間的通訊更簡單,避免了程序IPC引入新的複雜度。

適用場景:
隨便使用多執行緒並不能提升程式的執行效率,執行緒的建立和銷燬,上下文的切換,執行緒同步都是有效能消耗的。

1.I/O 阻塞會使作業系統發生任務排程,阻塞當前任務,所以程式碼中 I/O 多的情況下,使用多執行緒時可以將程式碼並行。例如多次讀整塊的檔案,或請求多個網路資源。
2.多執行緒能充分利用 CPU,所以有多處大計算量程式碼時,也可以使用多執行緒使他們並行執行.

PHP的多執行緒:
php預設不支援多執行緒,需要新增pthread擴充套件,
必須使用 –enable-maintainer-zts 引數重新編譯 PHP,這個引數是指定編譯 PHP 時使用執行緒安全方式。
執行緒安全:
執行緒安全是程式設計中的術語,指某個函式、函式庫在多執行緒環境中被呼叫時,能夠正確地處理多個執行緒之間的共享變數,使程式功能正確完成。
在傳統多執行緒中,由於多個執行緒共享變數,所以可能會導致出現如下問題:
存在一個全域性陣列

arr=array(a);;A1;B1;Apopa = array_pop(arr);a = ‘a’;;
B 執行緒也 pop 陣列元素 b=arraypop(arr); $a = null;;
此時 B 執行緒內就出現了靈異事件,明明陣列長度大於0,或沒有 pop 出東西;
PHP實現:
使用TSRM機制對全域性變數和靜態變數進行隔離
將全域性變數和靜態變數給每個執行緒都複製一份,各執行緒使用的都是主執行緒的一個備份,避免了變數衝突,也不會出現執行緒安全問題。

出現的問題:
    子執行緒一旦執行,主執行緒就不能再對子執行緒進行細節調整。執行緒就失去了執行緒之間通過全域性變數進行訊息傳遞的能力。
    使用TSRM機制分配和使用變數就會有額外的損耗,所以不需要多執行緒的PHP環境中 使用ZTS(非執行緒安全)

類和方法:
PHP將執行緒封裝成了Thread類,執行緒的建立通過例項化一個執行緒物件來實現,由於類的封裝性,變數的使用智慧
通過建構函式傳入,執行緒的運算結果也需要通過類變數傳出。

Thread方法:
    run():此方法是一個抽象方法,每個執行緒都要實現此方法,執行緒開始執行後,此方法中的程式碼會自動執行;
    start():在主執行緒內呼叫此方法以開始執行一個執行緒;
    join():各個執行緒相對於主執行緒都是非同步執行,呼叫此方法會等待執行緒執行結束;
    kill():強制執行緒結束;
    isRunning():返回執行緒的執行狀態,執行緒正在執行run()方法的程式碼時會返回 true;
因為執行緒安全的實現,PHP的多執行緒開始執行後,無法再通過共享記憶體空間通訊,執行緒也無法通過執行緒間通訊複用。

總結:
PHP對多執行緒進行封裝,安全性得到了保障,但是**

相關推薦

php執行pthread

**執行緒(thread): 作業系統能夠進行運算排程的最小單元,包含在程序中,是程序的實際運算單位。 一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條

《Exploring in UE4》執行機制[原理分析]

目錄 一.概述 二."標準"多執行緒 三.AsyncTask系統 3.1 FQueuedThreadPool執行緒池 3.2 Asyntask與IQueuedWork 3.3 其他相關技術細節 四.TaskGraph系統 4.1 從Tick函式談起 4.2 T

Java 執行方法

靜態方法 Thread Thread.currentThread() 該方法用於獲取當前執行緒物件,當我們用Runnable方式來實現run的時候,run中的this指向的不是執行緒物件,此時你要獲取

JAVA執行synchronized

Java語言的關鍵字,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。 當兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程

40個Java執行問題複習

1、多執行緒有什麼用? 一個可能在很多人看來很扯淡的一個問題:我會用多執行緒就好了,還管它有什麼用?在我看來,這個回答更扯淡。所謂"知其然知其所以然","會用"只是"知其然","為什麼用"才是"知其所以然",只有達到"知其然知其所以然"的程度才可以說是把一個知識點運用自如。OK,下面說說我對這個問題的看法:

阻塞式和執行 BIO ServerSocket例項

1.什麼是IO流是一種抽象概念,它代表了資料的無結構化傳遞。按照流的方式進行輸入輸出,資料被當成無結構的位元組或字元序列。從流中取得資料的操作稱為讀取,而向流中新增資料的操作稱為寫入。用來進行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進行輸入輸出。用通俗的話

.NET執行技術(4) 執行優先順序

執行緒優先順序從高到低分為:Highest 、AboveNormal、Normal、BelowNormal、Lowest共5個等級。通過設定Thread類的ThreadPriority屬性(可讀寫屬性)來調整。 範例: 下面的程式碼示例說明了更改執行緒優先順序的結果。建立兩

.NET執行技術(2) 建立、終止執行

System.Threading 名稱空間提供支援多執行緒程式設計的類和介面,使您可以輕鬆地執行建立和啟動新執行緒,同步多個執行緒,掛起執行緒以及中止執行緒等任務。 Thread類有幾個至關重要的方法,描述如下:Start():啟動執行緒;Sleep(int):靜態方法,

socket accept()執行連線

你也可以檢視我的其他同類文章,也會讓你有一定的收貨! 在使用accept函式的時候,如果伺服器面向多個客戶的連線, 必須使用while迴圈,每次迴圈阻塞在accept函式,等待新的連線到來

java執行狀態

java.lang.Thread類中有個內部列舉類State用來描述執行緒的各種狀態,具體如下 public enum State { /** * 尚未啟

iOS-GCD執行程式設計1

文明看博轉載是對自己的尊重也是對學者的鼓勵,歡迎討論 iOS-GCD多執行緒程式設計詳解 一.前言 前面的多執行緒程式設計中分別講到NSThread和NSOperation的多執行緒程式設計,本張主要是講述GCD的程式設計,GCD的多執行緒程式設計是基於BLock或者函式

Linux—POSIX執行管理-

還在編寫中..... 多執行緒開發在 Linux 平臺上已經有成熟的 Pthread 庫支援。其涉及的多執行緒開發的最基本概念主要包含三點:執行緒,互斥鎖,條件。其中,執行緒操作又分執行緒的建立,退出,等待 3 種。互斥鎖則包括 4 種操作,分別是建立,銷燬,加鎖和解鎖。條

C++11執行——lock

C++11提供了兩種管理鎖的類 std::lock_guard:與mutex RAII相關,方便執行緒對互斥量上鎖std::unique_lock:   與mutex RAII相關,方便執行緒對互斥量

.NET執行技術(1)

預設情況下,C# 程式具有一個執行緒。此執行緒執行程式中以Main方法開始和結束的程式碼。Main直接或間接執行的每一個命令都由預設執行緒(或主執行緒)執行,當Main返回時此執行緒也將終止。不過,可以建立輔助執行緒,以便與主執行緒一起並行執行程式碼。這些執行緒通常稱為“輔

MFC——執行程式設計

一、問題的提出      編寫一個耗時的單執行緒程式:        新建一個基於對話方塊的應用程式SingleThread,在主對話方塊IDD_SINGLETHREAD_DIALOG新增一個按鈕,ID為 IDC_SLEEP_SIX_SECOND,標題為“延時6秒”,新增按

程序、執行執行概念

一、概述 在windows中,每一個開啟執行的應用程式或後臺程式,比如執行中的QQ、谷歌瀏覽器、網易雲音樂、資源管理器等都是一個程序。我們感覺這些程式是“同時”執行的,但實際上,一個處理器同一時刻只能執行一個程序,只是CPU在高速輪換執行讓我們有這樣的錯覺,我

Java執行——執行方法

本系列文章是Java多執行緒的詳解介紹,對多執行緒還不熟悉的同學可以先去看一下我的這篇部落格Java基礎系列3:多執行緒超詳細總結,這篇部落格從巨集觀層面介紹了多執行緒的整體概況,接下來的幾篇文章是對多執行緒的深入剖析。   多執行緒的常用方法 1、currentThread()方法: 介紹:cur

Redis執行原理

本篇文章為你解答以下問題: 0:redis單執行緒的實現流程是怎樣的? 1:redis哪些地方用到了多執行緒,哪些地方是單執行緒? 2:redis多執行緒是怎麼實現的? 3:redis多執行緒是怎麼做到無鎖的?   0:redis單執行緒的實現流程是怎樣的? Redis一開始是單執行緒模型,在

Java執行執行排程

排程的概念 給定時間結點,時間間隔,任務次數,然後自動執行任務 應用場景舉例 1.日誌清理:每隔三個月,清理公司日誌檔案 2.日誌備份:每個一週,備份公司檔案 3.工資結算:每個月29號,考勤彙報,業務結算,計算工資 排程的實現方式:

Java執行-----執行

   1. 執行緒池的實現原理       提交一個任務到執行緒池中,執行緒池的處理流程如下: 判斷執行緒池裡的核心執行緒是否都在執行任務,如果不是(核心執行緒空閒或者還有核心執行緒沒有被建立)則建立一個新的工作執行緒來執行任務。如果核心執行緒都在執