多執行緒同步

2021-09-21 18:18:08 字數 3558 閱讀 6517

1)互斥鎖:當執行緒a鎖定了互斥變數時,執行緒b再去鎖定時就會被掛起,直到a解鎖。

注意:當執行緒要不斷的去輪詢檢查某個條件以判斷是否可以操作需同步的資料時,可使用條件變數提高效率。

demo如下:

#include

#include

#include

​pthread_mutex_t mutex;

​void

*print_msg

(void

*arg)

pthread_mutex_unlock

(&mutex);​

}​intmain()

2)訊號量:實際是乙個整數,只要訊號量的value大於0,其他執行緒就可以sem_wait成功,成功後訊號量的value減1。若value值不大於0,則sem_wait使得執行緒阻塞,直到sem_post釋放後value值加1,但是sem_wait返回之前還是會將此value值減1。

demo如下:

#include

#include

#include

#include

#include

#include

​void

*thread_func

(void

* msg)

;sem_t sem;

sem_t sem_add;

​#define msg_size 512

​int

main()

​ res =

sem_init

(&sem_add,0,

1);if

(res ==-1

)​res =

pthread_create

(&thread,

null

, thread_func, msg);if

(res !=0)

printf

("input some text. enter 'end' to finish...\n");

sem_wait

(&sem_add)

;while

(strcmp

("end\n"

, msg)!=0

)fgets

(msg, msg_size,

stdin);

sem_post

(&sem)

;//sem訊號量加1,讓子執行緒開始執行

sem_wait

(&sem_add)

;//sem_add訊號量減1,等待子執行緒處理完成

​ }

​ printf

("waiting for thread to finish...\n");

res =

pthread_join

(thread,

&thread_result);if

(res !=0)

​ printf

("thread joined\n");

​ sem_destroy

(&sem)

;sem_destroy

(&sem_add)

;exit(0

);​ return0;

}​void

*thread_func

(void

* msg)

}printf

("you input %d characters\n"

, i -1)

;printf

("to uppercase: %s\n"

, ptr);​

sem_post

(&sem_add)

;sem_wait

(&sem);}

sem_post

(&sem_add)

;pthread_exit

(null);

}

3)條件變數:經常和互斥鎖一起使用,使用時,條件變數被用來阻塞乙個執行緒,當條件不滿足時,執行緒會解開相應的互斥鎖並等待條件發生變化,一旦其他的某個執行緒改變了條件變數,它將通知相應的條件變數喚醒乙個或多個正被此變數阻塞的執行緒,這些執行緒將重新鎖定互斥鎖並重新測試條件是否滿足。

pthread_cont_init()

pthread_cont_destroy()

pthread_cont_wait() //執行緒解開mutex指向的鎖並被條件變數阻塞

pthread_cont_timedwait() //多了時間引數,當時間過了以後,即使條件變數不滿足,阻塞也被解除

pthread_cont_signal()/pthread_cont_broadcast //喚醒被條件變數阻塞的執行緒。

demo如下:

pthread1()

}pthread2()

sum =0;

pthread_mutex_unlock

(lock_s)

;}

注意:最終哪個執行緒接收到訊號,根據優先順序來

4)讀寫鎖:可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。

#include

#include

#include

​#define read_num 2

​pthread_rwlock_t lock;

​class data

intgeti()

​ float

getf()

​ private:

int i;

float f;};

​data *pdata =

null;​

void

*read

(void

*arg)

else

pthread_rwlock_unlock

(&lock);}

pthread_exit(0

);}​

void

*write

(void

*arg)

else

pthread_rwlock_unlock

(&lock);​

}pthread_exit(0

);}​

intmain()

pthread_create

(&writer,

null

, write,

null);

while(1

)return0;

}

互斥鎖用於互斥,對資源的訪問是無序的,訊號量用於同步,對資源的訪問是有序的

互斥量的加鎖和解鎖必須由同一執行緒對應使用,而訊號量可以由乙個執行緒釋放,另乙個執行緒得到

比如執行緒a,對資源m加鎖,去申請資源n;

執行緒b,對資源n加鎖,去申請資源m;

此種情況下會產生死鎖,要有效的避免死鎖,可使用銀行家演算法:

執行緒a和b在使用資源的時候按照同一順序,即加鎖時按照同一順序,這樣就可以避免死鎖。

多執行緒同步

synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...

多執行緒同步

同步 即限制某個資源在同一時間只能被同乙個執行緒訪問。執行緒安全問題 多個執行緒共同處理共享資源所導致的。解決 多執行緒處理乙個共享資源時,將處理共享資源的 利用關鍵字synchronized修飾。同步 塊 synchronized修飾 塊,synchronized lock 同步方法 synchr...

多執行緒同步

子執行緒迴圈10次,接著主線程迴圈100,接著又回到子執行緒迴圈10次,接著再回到主線程又迴圈100,如此迴圈50次,請寫出程式 package com.itcast public class traditionthreadcommuncation start 子執行緒 for int j 1 j ...