多執行緒概念
併發性和並行性
在共享記憶體的多處理器環境內的同乙個多執行緒程序中,程序中的每個執行緒都可以在一 個
單獨的處理器上併發執行,從而執行並行。如果程序中的執行緒數不超過處理器的數 目,
則執行緒的支援系統和操作環境可確保每個執行緒在不同的處理器上執行。例如,在 執行緒數
和處理器數目相同的矩陣乘法中,每個執行緒和每個處理器都會計算一行結果。
多執行緒結構一覽
傳統的unix已支援多執行緒的概念。每個程序都包含乙個執行緒,因此對多個程序進行 程式設計即
是對多個執行緒進行程式設計。但是,程序同時也是乙個位址空間,因此建立程序會 涉及到建立新
的位址空間。建立執行緒比建立新程序成本低,因為新建立的執行緒使用的是當前程序的位址空間。
間的切換。在程序內部的執行緒間通訊很簡單,因為這些執行緒會共享所有內容,特別是位址空間。
所以,乙個執行緒生成的資料可以立即用於其他所有執行緒。 在solaris9和較早的solaris發行版中,
支援多執行緒的介面是通過特定的子例程庫實現 的。這些子例程庫包括用於posix執行緒的libpthread
和用於solaris執行緒的 libthread。多執行緒通過將核心級資源和使用者級資源分離來提供靈活性。在
當前的發行 版中,對於這兩組介面的多執行緒支援是由標準c庫提供的。
使用者級執行緒
執行緒是多執行緒程式設計中的主程式設計介面。執行緒僅在程序內部是可見的,程序內部的執行緒會 共享諸如位址空間、開啟的檔案等所有程序資源。
使用者級執行緒狀態
以下狀態對於每個執行緒是唯一的。
■ 執行緒id
■ 暫存器狀態(包括pc和棧指標)
■ 棧■ 訊號掩碼
■ 優先順序
■ 執行緒專用儲存
由於執行緒可共享程序指令和大多數程序資料,因此乙個執行緒對共享資料進行的更改對 程序內其他執行緒是可見的。
乙個執行緒需要與同乙個程序內的其他執行緒互動時,該執行緒 可以在不涉及作業系統的情況下進行此操作
執行緒排程
posix標準指定了三種排程策略:先入先出策略(sched_fifo)、迴圈策略(sched_rr)和 自定義策略(sched_other)。
sched_fifo是基於佇列的排程程式,對於每個優先順序都會 使用不同的佇列。
sched_rr與fifo相似,不同的是前者的每個執行緒都有乙個執行時間 配額。
sched_fifo和sched_rr是對posix realtime的擴充套件。sched_other是預設的排程策略。
執行緒取消
乙個執行緒可以請求終止同乙個程序中的其他任何執行緒。目標執行緒(要取消的執行緒)可 以延後取消請求,
並在該執行緒處理取消請求時執行特定於應用程式的清理操作。
通過pthread取消功能,可以對執行緒進行非同步終止或延遲終止。非同步取消可以隨時發 生,而延遲取消
只能發生在所定義的點。延遲取消是預設型別。
執行緒同步
使用同步功能,可以控制程式流並訪問共享資料,從而併發執行多個執行緒。
共有四種同步模型:互斥鎖、讀寫鎖、條件變數和訊號。
■ 互斥鎖僅允許每次使用乙個執行緒來執行特定的部分**或者訪問特定資料。
■ 讀寫鎖允許對受保護的共享資源進行併發讀取和獨佔寫入。要修改資源,執行緒必須 首先獲取互斥寫鎖。只有釋放所有的讀鎖之後,才允許使用互斥寫鎖。
■ 條件變數會一直阻塞執行緒,直到特定的條件為真。
■ 計數訊號量通常用來協調對資源的訪問。使用計數,可以限制訪問某個訊號的執行緒 數量。達到指定的計數時,訊號將阻塞。
多執行緒學習二
買票事例 先看下面的例子 這樣啟動四個執行緒賣票,其實賣的總數量就是不5張了,而是20張了,這不符合我們的邏輯,實際需要的效果是總共有5張票,分到四個視窗去賣 四個執行緒 有沒有解決方法呢?如果將ticket類的成員變數設定為靜態的。設定num 10,這樣看的清楚一點 從下面的結果看申明為stati...
多執行緒學習二
lambda表示式 lambda表示式的說明 格式 引數列表 lambda表示式,可以推導,可以省略 1.引數列表 括號中的引數列表的資料型別,可以省略不寫 2.引數列表 括號中的引數如果只有乙個,那麼型別和 都可以省略不寫 3.如果 塊中只有一句 無論是否被有返回值,return,分號都可以否省略...
多執行緒學習二
1 package com.service.base 23 public class actor extends thread catch interruptedexception e 2324 if counter 100 2829 30 31 system.out.println getname...