linux 多執行緒通訊(三)執行緒的同步

2021-10-08 09:43:52 字數 3287 閱讀 3801

同步:

當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。

互斥量:

在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出現,當然這與處理器相關,但是在可移植的程式中不能對處理器做出任何預設。

互斥鎖為了讓執行緒訪問資料不產生中途,需要對變數加鎖,使得同一時刻只有乙個執行緒可以訪問變數,互斥量的本質就是鎖。

互斥量初始化;

1.動態分配,pthread_mutex_init()

2.靜態分配,設定為常量pthread_mutex_intializer

3.動態分配的互斥量在釋放記憶體之前需要呼叫pthread_mutex_destroy()

struct student

stu;

int i;

pthread_mutex_t mutex;

void

*thread_fun1

(void

*arg)

}void

*thread_fun2

(void

*arg)

}int main()

這樣對結構體變數賦值時,只會同步在乙個執行緒中執行,不加鎖會產生錯錯亂。

讀寫鎖與互斥量類似,不過互斥量要麼加鎖要麼不加,而且同一時刻只允許乙個執行緒加鎖。

pthread_rwlock rwlock

讀寫鎖有三種狀態,讀模式下加鎖,寫模式下加鎖,不加鎖,一次只有乙個執行緒可以站偶寫模式下的讀寫鎖,但是多個執行緒可以同時站有讀模式的讀寫鎖。

讀寫鎖非常適合對資料結構讀次數大於寫次數的程式,當它以讀模式鎖住時,是以共享的方式鎖住的;當它以寫模式鎖住時,是以獨佔的模式鎖住的。

初始化int pthread_rwlock_init(pthread_rwlock_t restrict rwlock, const pthread_rwlockattr_t restrict attr);

使用完需要銷毀

int pthread_rwlock_destroy(pthread_rwlock_t rwlock);

讀模式加鎖

寫模式加鎖 解鎖

pthread_rwlock_t rwlock;

void

*thread_fun1

(void

*arg)

}void

*thread_fun2

(void

*arg)

}int main()

如果先執行的是寫加鎖,後續無論讀寫都要等寫解鎖,若識先執行讀加鎖,後續讀寫都能,且讀鎖會為後續寫鎖先行。

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。

pthread_cond_t cond 例:

5//產品庫存大小

#define product_cnt

30//產品生產總數

struct product_cons

buffer;

void

init

(struct product_cons *p)

void

finish

(struct product_cons *p)

void

put(struct product_cons *p,int data)

//生產品到buffer

p->buffer[p-

>writepos]

=data;

p->writepos ++

;//儲存位置+1

if(p-

>writepos >=

buffer_size

)//滿了 歸零。

p->writepos =0;

pthread_cond_signal

(&p-

>notempty)

;//發出非空

pthread_mutex_unlock

(&p-

>lock);}

int get

(struct product_cons *p)

data=p-

>buffer[p-

>readpos]

; p-

>readpos++;if

(p->readpos>=

buffer_size

) p-

>readpos=0;

pthread_cond_signal

(&p-

>notfull)

;//發出非滿

pthread_mutex_unlock

(&p-

>lock)

;return data;

}void

*producer

(void

*data)

//每隔1秒生產乙個

printf

("producer stopped\n");

return

null;}

void

*consumer

(void

*data)

//每隔2秒消費乙個

因為讀是2秒一次,產出是1秒一次,設定是放不進第五個。

C 多執行緒程式設計 三 執行緒間通訊

七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...

Linux多執行緒學習(三)執行緒屬性

執行緒的建立函式pthread creat的第二個引數為pthread attr t型別的指標 預設屬性建立執行緒時賦值null pthread attr t是乙個結構體型別,定義如下 typedef struct pthread attr t 執行緒屬性的使用步驟 建立屬性物件 以預設值初始化屬性...

多執行緒程式設計之三 執行緒間通訊

多執行緒程式設計之三 執行緒間通訊 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說...