執行緒建立和互斥

2021-09-26 01:37:33 字數 1670 閱讀 1775

執行緒的基本概念

我們知道程序是計算機分配資源的基本單位,計算機會為乙個程序分配記憶體空間和cpu的時間片等資源,而執行緒則是比程序更小的單位,乙個程序可以包含幾個執行緒,其中乙個為主執行緒,在乙個程序內的執行緒中記憶體資源是共享的,因此在乙個程序中的全域性變數每個執行緒都可以訪問的,但是每個執行緒的執行順序我們是不可控的,因此當幾個執行緒同時訪問乙個全域性變數時便會出現問題,接下來我來貼下一段**。

**#include

#include

#include

#include

int a=0;

void * fun1()

return (void *)1;
void * fun2()

////printf("%d\n",a);

return (void *)2;

}int main()

我們可以看到這段**建立了兩個執行緒,同時訪問乙個全域性變數,按照我們通常的想法這個輸出的最後結果應該是400000,但是有的時候會出現我們意料之外的結果(多執行幾次)。

399522

399523

399524

399525

399526

399527

399528

399529

399530

399531

399532

399533

399534

399535

399536

399537

399538

399539

399539

可以看到最後輸出的不是400000,這邊是出現的問題,出現這個問題的原因:這是因此在我們的cpu在不同執行緒間進行切換時,當我們的第乙個執行緒的乙個暫存器取出我們記憶體中的a值時,這時發生了執行緒的切換,便會將第乙個執行緒的狀態存入記憶體中(這時剛取出的a的值便會存入乙個棧中,暫時儲存第乙個執行緒的資源),這時第二個執行緒便會執行,當再次切換到第一線程時,便會恢復原來的狀態,從棧中取出原來暫存器中的值,繼續執行,這時便會存在問題了,因為這時是從棧中去出的a值,這個值還是原來第一次執行後的結果,但是此時我們的第二個執行緒已經改變了a的值,因此這時我們的第乙個執行緒並沒有從第二個執行緒返回的狀態中取a值,因此最終輸出的a值便會比我們預期的小。

執行緒的建立

pthread_create(pthread_t *p,null,函式,函式的引數)

建立乙個執行緒,成功返回0,否則返回-1

pthread_join(pthread p,乙個指標的位址)

等待乙個執行緒的結束,第二個引數表示執行緒結束的返回值。

在乙個執行緒中如果使用return 或者 exit(),會退出整個程序

因此我們使用pthread_exit()來退出乙個執行緒

執行緒的互斥

前面乙個例子我們知道使用執行緒來操作乙個全域性變數時會出現一些問題,執行緒互斥便是來解決這個問題的。

原理表示當乙個執行緒正在使用乙個全域性變數時我們可以給使用全域性變數的這一段**,加乙個鎖,不讓其他執行緒訪問。

使用的函式

首先建立乙個鎖變數

pthread_mutex_t a;

初始化pthread_mutex_init()

加鎖pthread_mutex_lock()

解鎖pthread_mutex_unlock()

銷毀鎖pthread_mutex_destory()

建立和執行執行緒

thread thread new thread thread.setname t1 thread.start log.debug running 建立任務物件 runnable runnable new runnable 引數 1 是任務物件 引數 2 是執行緒名字,推薦 thread t1 ne...

執行緒的建立和啟動

1 定義乙個mytask類,並繼承於os thread,重寫執行緒主函式routine 2 使用這個類 注 在大多數作業系統上,執行緒的建立和啟動是乙個連續的動作 mytask task task.run 建立並啟動執行緒 這是函式的呼叫,是乙個 參考a01 01中的例子 開啟資源監視器,觀察tes...

執行緒的建立和執行緒間通訊

執行緒的建立 include intpthread create pthread t tidp,constpthread attr t attr,void start rtn void void arg 建立執行緒 引數 pthread t tidp 執行緒id,在linux系統中是int,在uni...