Linux 執行緒同步(一)

2021-07-04 12:51:54 字數 3043 閱讀 7846

執行緒為什麼要同步

1.共享資源,多個執行緒可以對共享資源操作

2.由於併發原因,執行緒操作共享資源操作順序不一樣,可能會造成髒資料

3.處理器對儲存器的操作一般不是原子操作。

臨界區(critical section)

臨界區為了保證在某一時刻只有乙個執行緒能訪問資料的簡便方法,在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖同時訪問同時訪問臨界區,那麼在有乙個執行緒進入後所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入到臨界區的執行緒離開。臨界區在被釋放後,其他執行緒可以繼續搶占,並以此達到用原子操作共享資源的目的。

臨界區的選定

臨界區的選定應盡可能小,如果選定太大會影響程式的並行處理效能。

常見的執行緒同步方法有:1.互斥量 2.讀寫鎖 3.條件變數 4.訊號量 

一、互斥量

互斥量是一種簡單的加鎖方法來控制對共享資源的原子操作。這個互斥量只有兩種狀態,也就是上鎖和解鎖,可以把互斥量看作某種意義上的全域性變數。在同一時刻只能有乙個執行緒掌握某乙個互斥鎖,擁有上鎖狀態的執行緒能對共享資源進行操作。如果其它執行緒再去對乙個已經被上鎖的互斥鎖上鎖,則該執行緒就會被掛起,直到上鎖的執行緒釋放掉互斥鎖為止。

其互斥鎖可以分為快速互斥鎖,遞迴互斥鎖,和檢錯互斥鎖。這3種鎖的區別主要在於對其他的未占有互斥鎖的的執行緒在希望得到互斥鎖時候是否需要阻塞等待。快速鎖是指呼叫執行緒會阻塞直至擁有互斥鎖的執行緒解鎖為止。遞迴互斥鎖能夠成功的返回,並且增加呼叫執行緒再互斥上加鎖的次數,而檢錯互斥鎖的非阻塞版本,它會立即返回並返回乙個錯誤資訊。linux 下預設是快速互斥鎖。值得說遞迴鎖和非遞迴鎖二者唯一的區別是,同乙個執行緒可以多次獲取同乙個遞迴鎖,不會產生死鎖。而如果乙個執行緒多次獲取同乙個非遞迴鎖,則會產生死鎖

mutex操作原語

pthread_mutex_t

pthread_mutex_init() //互斥鎖的初始化

pthread_mutex_destroy() //互斥鎖釋放

pthread_mutex_lock() //互斥鎖上鎖

pthread_mutex_trylock() //嘗試去加鎖 該函式語義與 pthread_mutex_lock() 類似,不同的是在鎖已經被佔據時返回 ebusy 而不是掛起等待。

pthread_mutex_unlock() //互斥鎖解鎖

互斥量例項

#include#include#include #include#include#define max  20

pthread_mutex_t mutex=pthread_mutex_initializer; //posix定義了乙個巨集pthread_mutex_initializer來靜態初始化互斥鎖

//測試發現沒有初始化也沒有出錯,最好還是初始化一下吧

int count=0;

void *thread_fun(void *arg)

printf("thread id:%x,count:%d \n",(unsigned int)pthread_self(),count);

sleep(10);//睡眠10秒

可以看到讀鎖是共享的,因為都輸出結果了。

#include#include#include #include#include#define max  20

pthread_rwlock_t rwlock=pthread_rwlock_initializer;;

int count=1;

void *thread_fun_read(void *arg)

printf("read lock thread id:%x,count:%d \n",(unsigned int)pthread_self(),count);

sleep(10);//睡眠10秒

if(pthread_rwlock_unlock(&rwlock)!=0)

return null ;

}void *thread_fun_write(void *arg)

count++;

printf("write lock thread id:%x,count:%d \n",(unsigned int)pthread_self(),count);

sleep(10);

if(pthread_rwlock_unlock(&rwlock)!=0)

return null ;

}int main()

pthread_create(&tid3,null,thread_fun_write,null);//寫鎖的

寫鎖先加了,讀鎖就不能再加了。反之也一樣。

linux 執行緒 執行緒同步

因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...

Linux執行緒同步

1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...

Linux執行緒同步

1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...