執行緒同步中的鎖和訊號量

2021-10-25 01:45:55 字數 2081 閱讀 9416

由於工作上用到執行緒之間的同步,而且有超時處理,問題是:子主線程等待的時候已經加鎖了,為什麼主線程中還可以再去加鎖給子執行緒傳送訊號呢?

pthread_cond_timedwait()函式有三個入口引數:

pthread_cond_t __cond:條件變數(觸發條件)

pthread_mutex_t __mutex: 互斥鎖

struct timespec __abstime: 等待時間(其值為系統時間 + 等待時間)

當在指定時間內有訊號傳過來時,pthread_cond_timedwait()返回0,否則返回乙個非0數;

在使用pthread_cond_timedwait()函式時,必須有三步:

加互斥鎖:pthread_mutex_lock(&__mutex)

等待:pthread_cond_timedwait(&__cond, &__mutex, &__abstime) //解鎖->等待->加鎖

解互斥鎖:pthread_mutex_unlock(&__mutex)

傳送訊號量時,也要有三步:

加互斥鎖:pthread_mutex_lock(&__mutex)

傳送:pthread_cond_signal(&__cond)

解互斥鎖:pthread_mutex_unlock(&__mutex)

問題解答:其實這是因為在pthread_cond_timedwait()函式中已經對互斥鎖進行解鎖操作了,所以這個時候傳送訊號量是不會阻塞的。

測試**:

#include

#include

#include

#include

#include

#include

#include

#define sendsigtime 3

pthread_cond_t g_cond;

pthread_mutex_t g_mutex;

char time_tmp[

128]=""

;char

*display_time

(void

)void

*thread_fun

(void

*arg)

intmain

(int argc,

char

* ar**)

printf

("[%s] %s wait %ds send signal\n"

,display_time()

, __function__, sendsigtime)

;sleep

(sendsigtime)

;printf

("[%s] %s lock\n"

,display_time()

, __function__)

;pthread_mutex_lock

(&g_mutex)

;printf

("[%s] %s send signal\n"

,display_time()

, __function__)

;pthread_cond_signal

(&g_cond)

;printf

("[%s] %s send signal end\n"

,display_time()

, __function__)

;pthread_mutex_unlock

(&g_mutex)

;printf

("[%s] %s send unlock end\n"

,display_time()

, __function__)

;pthread_join

(pid,

null);

pthread_cond_destroy

(&g_cond)

;pthread_mutex_destroy

(&g_mutex)

;return0;

}

執行結果:

執行緒訊號量同步

thread sem.c include include include include define thread number 3 define repeat number 3 define delay time levels 10.0 sem t sem thread number void ...

執行緒同步 訊號量

執行緒同步方法 訊號量不常用,找到個帖子不錯,記錄一下!依賴的標頭檔案 include 函式宣告 sem t 表示訊號量 int sem init sem t sem,int pshared,unsigned int value 名稱 sem init 功能 initialize an unname...

執行緒同步 訊號量

進化版的互斥鎖 1 n 由於互斥鎖的粒度比較大,如果我們希望在多個執行緒間對某一物件的部分資料進行共享,使用互斥鎖是沒有辦法實現的,只能將整個資料物件鎖住。這樣雖然達到了多執行緒操作共享資料時保證資料正確性的目的,卻無形中導致執行緒的併發性下降。執行緒從並行執行,變成了序列執行。與直接使用單程序無異...