多執行緒分析

2022-07-28 16:06:26 字數 2237 閱讀 3573

多程序適合於完全不相干的幾件事情同時做。

因為除了**段相同之外,別的都是互不相干的,而多執行緒則可以

所謂多執行緒:

執行緒是可執行**的可分派單元。這個名稱**於「執行的線索」的概念。在基於執行緒的多工的環境中,所有程序有至少乙個執行緒,但是它們可以具有多個任務。這意味著單個程式可以併發執行兩個或者多個任務。

簡而言之,執行緒就是把乙個程序分為很多片,每一片都可以是乙個獨立的流程。這已經明顯不同於多程序了,程序是乙個拷貝的流程,而執行緒只是把一條河流截成很多條小溪。它沒有拷貝這些額外的開銷,但是僅僅是現存的一條河流,就被多執行緒技術幾乎無開銷地轉成很多條小流程,它的偉大就在於它少之又少的系統開銷。(當然偉大的後面又引發了重入性等種種問題,這個後面慢慢比較)。

還是先看linux提供的多執行緒的系統呼叫:

int pthread_create(pthread_t *restrict tidp,

const pthread_attr_t *restrict attr,

void *(*start_rtn)(void),

void *restrict arg);

returns: 0 if ok, error number on failure

第乙個引數為指向執行緒識別符號的指標。

第二個引數用來設定執行緒屬性。

第三個引數是執行緒執行函式的起始位址。

最後乙個引數是執行函式的引數。

view plaincopy to clipboardprint?

#include#include#include#include#includevoid* task1(void*);

void* task2(void*);

void usr();

int p1,p2;

int main()

void usr()

void* task1(void *arg1)

void* task2(void *arg2)

#include#include#include#include#includevoid* task1(void*);

void* task2(void*);

void usr();

int p1,p2;

int main()

void usr()

void* task1(void *arg1)

void* task2(void *arg2)

這個多執行緒的例子應該很明了了,主線程做自己的事情,生成2個子執行緒,task1為分離,任其自生自滅,而task2還是繼續送外賣,需要等待返回。(因該還記得前面說過殭屍程序吧,執行緒也是需要等待的。如果不想等待,就設定執行緒為分離執行緒)

額外的說下,linux下要編譯使用執行緒的**,一定要記得呼叫pthread庫。如下編譯:

gcc -o pthrea -pthread pthrea.c

總之多執行緒有以下要注意的事項:

1.看完前面,應該對多程序和多執行緒有個直觀的認識。如果總結多程序和多執行緒的區別,你肯定能說,前者開銷大,後者開銷較小。確實,這就是最基本的區別。

2.執行緒函式的可重入性:

說到函式的可重入,和執行緒安全,我偷懶了,引用網上的一些總結。

執行緒安全:概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。

可重入:概念基本沒有比較正式的完整解釋,但是它比執行緒安全要求更嚴格。根據經驗,所謂「重入」,常見的情況是,程式執行到某個函式foo()時,收到訊號,於是暫停目前正在執行的函式,轉到訊號處理函式,而這個訊號處理函式的執行過程中,又恰恰也會進入到剛剛執行的函式foo(),這樣便發生了所謂的重入。此時如果foo()能夠正確的執行,而且處理完成後,之前暫停的foo()也能夠正確執行,則說明它是可重入的。

執行緒安全的條件:

要確保函式執行緒安全,主要需要考慮的是執行緒之間的共享變數。屬於同一程序的不同執行緒會共享程序記憶體空間中的全域性區和堆,而私有的執行緒空間則主要包括棧和暫存器。因此,對於同一程序的不同執行緒來說,每個執行緒的區域性變數都是私有的,而全域性變數、區域性靜態變數、分配於堆的變數都是共享的。在對這些共享變數進行訪問時,如果要保證執行緒安全,則必須通過加鎖的方式。

可重入的判斷條件:

要確保函式可重入,需滿足一下幾個條件:

1、不在函式內部使用靜態或全域性資料

2、不返回靜態或全域性資料,所有資料都由函式的呼叫者提供。

3、使用本地資料,或者通過製作全域性資料的本地拷貝來保護全域性資料。

4、不呼叫不可重入函式。

C 多執行緒分析

以一道多執行緒面試題引入 編寫乙個程式,開啟 3個執行緒,執行緒的id 分別為a b c,每個執行緒將自己的 id在螢幕上列印 5遍,要求輸出結果必須按 abc的順序顯示 如 abcabc 依次遞推!首先簡化該多執行緒問題,即列印函式要求是aaaaabbbbbccccc。接著 分析多執行緒搶占的資源...

cuda之多執行緒分析

cuda的執行緒是多維的,啟動乙個執行緒格,執行緒格可以是多維的,執行緒格中分為執行緒塊,執行緒塊也可以是多維的,執行緒塊中包含執行緒,對於gpu來說,同時啟動200萬個執行緒是很輕易的事情。blockidx 當前執行裝置 的執行緒塊的索引 dim3 grid dim,dim 宣告乙個二維的執行緒格...

多執行緒競爭問題分析

public class mystack public synchronized string pop throws interruptedexception return list remove list size 1 問題 這段 大多數情況下執行正常,但是某些情況下會出問題。什麼時候會出現什麼問...