linux 執行緒 linux多執行緒同步 互斥鎖

2021-10-11 14:10:10 字數 1681 閱讀 3222

linux多執行緒程式設計-互斥鎖

鎖機制多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,訪問臨界資源的程式段稱作是臨界區。

實現執行緒間的互斥與同步機制的是鎖機制,下面是常用的鎖機制的函式和類

pthread_mutex_t mutex 鎖物件

pthread_mutex_init(&mutex,null) 在主線程中初始化鎖為解鎖狀態

pthread_mutex_t mutex = pthread_mutex_initializer 編譯時初始化鎖位解鎖狀態

pthread_mutex_lock(&mutex)(阻塞加鎖)訪問臨界區加鎖操作

pthread_mutex_trylock( &mutex)(非阻塞加鎖); pthread_mutex_lock() 類似,不同的是在鎖已經被佔據時返回 ebusy 而不是掛起等待。

pthread_mutex_unlock(&mutex): 訪問臨界區解鎖操作

#include

#include

#include

#include

#include

void* ticketport1(void*);

void* ticketport2(void*);

int tickets=100;

pthread_mutex_t mutex;

int main()

int ret;

pthread_t id1,id2;

pthread_mutex_init(&mutex,null); 初始化互斥量 ret=pthread_create(&id1,null,ticketport1,null);

if(ret<0) else

pthread_mutex_unlock(&mutex); //給互斥量解鎖

break;

pthread_yield(); //執行緒的排程函式,使兩個執行緒都有執行機會

return (void*)0;

void* ticketport2(void* arg)

while(1)

pthread_mutex_lock(&mutex); //給互斥量上鎖

if(tickets>0)

usleep(1000);

printf("thread2 sell ticket: %d",tickets--); pthread_mutex_unlock(&mutex); //給互斥量解鎖

} else

pthread_mutex_unlock(&mutex); //給互斥量解鎖

break;

pthread_yield(); //執行緒的排程函式,使兩個執行緒都有執行機會

return (void*)0;

我們用pthread_mutext_init函式來初始化互斥量,然後再用pthread_mutex_lock函式和 pthread_mutext_unlock分別進行上鎖和解鎖,至於這兩個函式的引數說明,大家可以上網查閱,在這我只說明功能。我們用gcc帶選項 -lpthread編譯後多次執行發現即使強制執行緒在很短的時間內(如1ms)睡眠引起執行緒切換,也不會導致上述的問題,說明互斥鎖可以解決執行緒間的同步 問題

linux多執行緒

linux下為了多執行緒同步,通常用到鎖的概念。posix下抽象了乙個鎖型別的結構 ptread mutex t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖 lock 後,別人就無法開啟,只有當鎖沒有關閉 unlock 的時候才能訪問資源。它主要用如下5個函式進行操作。1 pthre...

linux多執行緒

執行緒標識 就像每個程序都有乙個id一樣,執行緒也有自己的id。程序id用pid t來表示,他是乙個unsigned int。程序id用pthread t來表示,pthread t不能把它當整數處理。程序可以通過pthread self 函式獲得自身的執行緒id。執行緒建立 在程序中只有乙個控制線程...

Linux多執行緒

一 執行緒的特點 1.執行緒是程序的乙個執行流,是cpu排程和分配的基本單位。執行緒是程式執行的最小單位。2.執行緒不會影響到其它執行緒的執行。比如乙個執行緒崩潰,其它執行緒正常執行。3.同一程序內的執行緒共享程序的位址空間。二 乙個執行緒的組成 1.乙個指向當前被執行指令的指令指標 2.乙個棧空間...