linux執行緒同步問題

2021-07-08 09:27:09 字數 2364 閱讀 2903

執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。linux系統提供了多種方式來處理執行緒同步的問題,其中最常用的是互斥鎖,條件變數和非同步訊號。

互斥鎖通過鎖機制來實現執行緒間同步。

在linux下,執行緒的互斥量資料型別是pthread_mutex_t。在使用前 要對它進行初始化。

a.靜態賦值法:pthread_mutex_t mutex=pthread_mutex_initalizer

b.通過pthread_mutex_init函式,該函式原型如下:

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經加鎖,當前嘗試加鎖的執行緒就會阻塞,直到互斥鎖被其他執行緒釋放。

a.int pthread_mutex_lock(pthread_mutex_

*mutex)

b.int pthread_mutex_tylock(pthread_mutex_t *mutex)

注意:加鎖時,不論是哪種型別的鎖。都不可能被兩個不同的執行緒同時得到,其中乙個必須等待解鎖,在同一程序中的執行緒,如果加鎖後沒有解鎖,則其他執行緒將無法再獲得該鎖。

完成了對共享資源的訪問後,要對互斥鎖進行解鎖。需滿足一下條件:

a.互斥鎖必須處於加鎖狀態

b.呼叫本函式的執行緒必須是給互斥鎖加鎖的狀態

函式原型是:int pthread_mutex_unlock(pthread_mutex_t *mutex)

清除乙個互斥鎖的目的在於釋放它所占用的資源。該函式原型如下:int pthread_mutex_destory (pthread_mutex_t *mutex)

在上述的**中,兩個函式對共享全域性變數globalnumber進行讀寫操作。write_globalnumber函式使用互斥鎖保證在修改變數的時候操作一次執行完畢,不會中斷。而read_globalnumber函式使用互斥鎖保證在讀資料的時候,全域性變數globalnumber不會被修改,確保讀到正確的資料。

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制。條件變數巨集觀上類似if語句,符合條件就能執行某段程式,否則只能等待條件成立。使用條件變數主要包括兩個動作:乙個等待使用資源的執行緒等待「條件變數被設定為真」;另乙個執行緒在使用完資源後「設定條件為真」,這樣就可以保證執行緒間的同步了。

a.靜態賦值法:pthread_cond_t cond=pthread_cond_initaler

b.使用函式pthread_cond_init 函式原型如下:

int pthread_cond_init(pthread_cond_t*cond pthread_condattr_t *cond_attr)

釋放由mutex指向的互斥鎖,同時阻塞等待條件變數為真才行。timewait函式將阻塞直到條件變數獲得訊號或者經過abstime指定的時間,也就是說,如果在給定時刻前條件沒有滿足,則返回etmeout,結束等待。

a.int pthread_cond_wait(pthread_cond_t cond pthread_mutex_t *mutex)

b.int pthread_cond_timewait(pthread_cond_t*cond pthread_mutex*mutex.const timespec *abstime)

pthread_cond_signal和pthread_cond_broadcast啟用所有等待的執行緒。

a.int pthread_cond_signal(pthread_cond_t *cond);

b.int pthread_cond_broadcast(pthread_cond_t *cond);

注意:pthread_cond_signal()啟用乙個等待條件成立的執行緒,存在多個等待執行緒時,則按順序啟用其中的乙個;而pthread_cond_broadcast()則啟用所有的等待執行緒。

只有在沒有執行緒等待該條件變數的時候才能清除這個條件變數,否則返回ebusy。

執行**結果如下:

thread1 is

running

thread2 is

running

thread2 is

running

thread2 is

running

thread2 is

running

訊號與任何執行緒都是非同步的,也就是說訊號到達執行緒的時間是不定的,如果有多個執行緒可以接收非同步訊號,則只有乙個被選中。如果併發的多個同樣的訊號被送到乙個程序,每乙個將被不同的執行緒處理。如果所有的執行緒遮蔽該訊號,則這些訊號將被掛起。直到有訊號解除遮蔽來處理它們。

linux 執行緒同步問題

include include include include include define max 10 pthread mutex t mutex pthread mutex initializer pthread cond t cond pthread cond initializer int...

linux 執行緒 執行緒同步

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

執行緒同步問題

昨天簡單研究了一點執行緒的同步問題 package com.pb.thread public class waymakethread 建立乙個執行緒,繼承thread類 class mythread extends thread 建立乙個類,實現runable介面,這不是乙個執行緒類 class m...