同步:
當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。
互斥量:
在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出現,當然這與處理器相關,但是在可移植的程式中不能對處理器做出任何預設。
互斥鎖為了讓執行緒訪問資料不產生中途,需要對變數加鎖,使得同一時刻只有乙個執行緒可以訪問變數,互斥量的本質就是鎖。
互斥量初始化;
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 執行緒屬性的使用步驟 建立屬性物件 以預設值初始化屬性...
多執行緒程式設計之三 執行緒間通訊
多執行緒程式設計之三 執行緒間通訊 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說...