執行緒程式設計基礎

2021-07-25 16:09:00 字數 2570 閱讀 2834

執行緒

程序與執行緒

乙個程序內部的執行緒可以共享資源

fork和建立新執行緒的區別

執行緒的優點

能充分利用多處理器的可並行數量—-提高併發性

i/o密集型應用,為了提高效能,將i/o操作重疊。執行緒可以同時等待不同的i/o操作。—-資料通訊、共享資料方便

執行緒缺點

執行緒排程競爭範圍

n:1使用者執行緒模型

1:1核心執行緒模型

n:m混合執行緒模型

n:m混合執行緒模型提供了兩級控制,將使用者執行緒對映為系統的可排程體以實現並行,這個可排程體稱為輕量級程序(lwp:lightweight process),lwp再一一對映到核心執行緒

總結:

(1)使用者級執行緒

使用者級執行緒主要解決的是上下文切換的問題,它的排程演算法和排程過程全部由使用者自行選擇決定,在執行時不需要特定的核心支援。在這裡,作業系統往往會提供乙個使用者空間的執行緒庫,該執行緒庫提供了執行緒的建立、排程和撤銷等功能,而核心仍然僅對程序進行管理。如果乙個程序中的某乙個執行緒呼叫了乙個阻塞的系統呼叫函式,那麼該程序包括該程序中的其他所有執行緒也同時被阻塞。這種使用者級執行緒的主要缺點是在乙個程序中的多個執行緒的排程中無法發揮多處理器的優勢。—-只在本程序排程,還可能阻塞

(2)輕量級程序

輕量級程序是核心支援的使用者執行緒,是核心執行緒的一種抽象物件。每個程序擁有乙個或多個輕量級程序,而每個輕量級程序分別被繫結在乙個核心執行緒上。

(3)核心執行緒

這種執行緒允許不同程序中的執行緒按照統一相對優先排程方法進行排程,這樣就可以發揮多處理器的併發優勢。

現在大多數系統都採用使用者級執行緒與核心級執行緒並存的方法。乙個使用者級執行緒可以對應乙個或幾個核心級執行緒,也就是「一對一」或「多對一」模型。這樣既可滿足多處理機系統的需要,也可以最大限度地減少排程開銷。

使用執行緒機制大大加快上下文切換速度而且節省很多資源。但是因為在使用者態和核心態均要實現排程管理所以會增加實現的複雜度和引起優先順序翻轉的可能性。乙個多執行緒程式的同步設計與除錯也會增加程式實現的難度

posix執行緒庫

pthread_create函式

返回值:成功返回0;失敗返回錯誤碼

錯誤檢查

pthread_exit函式

pthread_join函式

返回值:成功返回0;失敗返回錯誤碼

pthread_self函式

pthread_cancel函式

pthread_detach函式

執行緒屬性

獲取與設定分離屬性

獲取與設定棧大小

獲取與設定棧溢位保護區大小

獲取與設定執行緒競爭範圍

獲取與設定排程策略

獲取與設定繼承的排程策略

獲取與設定排程引數

併發級別

繫結屬性

linux中採用「一對一」的執行緒機制,也就是乙個使用者執行緒對應乙個核心執行緒。繫結屬性就是指乙個使用者執行緒固定地分配給乙個核心執行緒,因為cpu時間片的排程是面向核心執行緒(也就是輕量級程序)的,因此具有繫結屬性的執行緒可以保證在需要的時候總有乙個核心執行緒與之對應。而與之對應的非繫結屬性就是指使用者執行緒和核心執行緒的關係不是始終固定的,而是由系統來控制分配的。

分離屬性

分離屬性是用來決定乙個執行緒以什麼樣的方式來終止自己。在非分離情況下,當乙個執行緒結束時,它所占用的系統資源並沒有被釋放,也就是沒有真正的終止。只有當pthread_join()函式返回時,建立的執行緒才能釋放自己占用的系統資源。而在分離屬性情況下,一個執行緒結束時立即釋放它所占有的系統資源。這裡要注意的一點是,如果設定乙個執行緒的分離屬性,而這個執行緒執行又非常快,那麼它很可能在pthread_create()函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用。

多執行緒程式設計基礎

一直以來,自己都不會多執行緒的程式設計。今天決定好好的補補!一 多執行緒的基本概念 二 多執行緒中的重要函式 1 handle createthread lpsecurity attributes lpthreadattributes,dword dwstacksize,lpthread start...

多執行緒程式設計基礎

值得參考 include int pthread create thread id,attr,func,arg 其中func表示該執行緒需要執行的 位址 從執行緒 處return pthread cancle終止同一程序中的另一線程 呼叫pthread exit來終止自己 設定取消執行緒的狀態和型別...

併發程式設計 執行緒基礎

解決髒讀 造成髒讀的原因是在寫入資料 set 的時候,呼叫了讀取資料 get 的方法,造成讀到修改的資料的現象。解決的辦法是 使用synchronize同時對get方法和set方法加鎖,這樣set的時候就無法get 鎖重入 概念 對於拿到某個鎖的執行緒,它由可能再拿到其他的鎖。對於它剛執行完並釋放的...