Linux下C語言執行緒的建立 傳參 互斥和同步

2021-09-10 21:25:17 字數 2343 閱讀 7125

程序:程式是人使用計算機語言編寫的,可以實現一定功能,並且可以執行的**集合。而程序是正在執行中的程式。當程式被執行時,執行人的許可權和屬性,以及程式的**都會被加載入記憶體,作業系統給這個程序分配乙個 id,稱為 pid(程序 id)。是資源分配的基本單位。

執行緒:執行緒是程序中的乙個實體,是程序的一部分,乙個沒有執行緒的程序可以被看作是單執行緒的。執行緒有時又被稱為輕權程序或輕量級程序,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬乙個程序的其它執行緒共享程序所擁有的全部資源。是 cpu 排程的乙個基本單位。

多執行緒:多執行緒就是指乙個程序中同時有多個執行路徑(執行緒)正在執行。在乙個程式中,有很多的操作是非常耗時的,如資料庫讀寫操作,io操作等,如果使用單執行緒,那麼程式就必須等待這些操作執行完成之後才能執行其他操作。使用多執行緒,可以在將耗時任務放在後台繼續執行的同時,同時執行其他操作。

乙個執行緒只能屬於乙個程序,而乙個程序可以有多個執行緒,但至少有乙個執行緒。

那麼在使用多執行緒的時候就得注意執行緒安全。執行緒安全是多執行緒程式設計時的電腦程式**中的乙個概念。在擁有共享資料的多條執行緒並行執行的程式中,執行緒安全的**會通過同步機制保證各個執行緒都可以正常且正確的執行,不會出現資料汙染等意外情況。

互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

多執行緒就好比如你媽媽有三個孩子,這三個孩子就是三個執行緒,這時候你媽媽買回來乙個玩具給三個孩子玩,這個玩具是三個孩子共有的,這三個孩子都想玩這個玩具,一起共同去爭搶這個玩具,最後搶著搶著玩具就壞了。這個玩具就相當於程式中的全域性變數,乙個執行緒想用這個全域性變數,另外乙個執行緒也想用這個變數,共同爭搶乙個資源,很容易破壞程式的一致性。想要保護這個玩具,這時候就得用到互斥鎖,互斥鎖作用就是在同一時候這個玩具只能乙個孩子玩。即乙個孩子拿著這個玩具關上門,上鎖,另外領個孩子就不能接觸到,只能等待這個孩子解鎖開門,輪到下乙個孩子玩。這就保證了程式的一致性。

當然互斥你也可以理解為在學校宿舍6人間只有意見衛生間,當某個舍友進去,會把門鎖上,當完成他想做的事,會把門鎖開啟,在讓下乙個舍友進去。這6人就代表6個執行緒,衛生間代表著程式的全域性變數。

以下程式是執行緒的建立,傳參,互斥:

#include #include #include typedef struct meter meter_t;

pthread_mutex_t mutex_lock; //定義乙個互斥全域性名

int count = 0;

void* thread_test(void *ar**)

int main(int argc, char const *ar**)

程式的結果如下:

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

同步的**如下:乙個執行緒減10,但是不會到負數,當count=0的時候,會等待另乙個執行緒加10,另乙個執行緒在發資訊說對這個執行緒說我已經加10了,你現在可以減10了。意味著程式都會讓加10的執行緒先執行完成,減10的執行緒才能執行完成,從而達到執行緒有序的訪問。

#include #include #include typedef struct meter meter_t;

pthread_mutex_t mutex_lock; //互斥

pthread_cond_t count_event; //同步

int count = 0;

void* thread_test1(void *ar**)

count = count-10;

printf("test1 count: %d\n",count);

pthread_mutex_unlock(&mutex_lock); //解鎖

}void* thread_test2(void *ar**)

printf("test2 count: %d\n",count);

pthread_mutex_unlock(&mutex_lock); //解鎖

}int main(int argc, char const *ar**)

程式執行結果如下:

Linux系統下C語言程式設計 執行緒的建立和使用

2008 04 21 10 03 佚名 51cto.com 執行緒的建立是用下面的幾個函式來實現的.include int pthread create pthread t thread,pthread attr t attr,void start routine void void arg voi...

linux下C語言執行緒的介紹

linux下c語言執行緒的介紹 ree雪影 今天一天小記。linux下執行緒的介紹 下面是主要的函式介紹 建立執行緒要實現的函式 int pthread create pthread t thread,pthread attr t attr,void start routine void void ...

linux下的C語言開發(執行緒等待)

和多程序一樣,多執行緒也有自己的等待函式。這個等待函式就是pthread join函式。那麼這個函式有什麼用呢?我們其實可以用它來等待執行緒執行結束。include include include include void func void args int main pthread join p...