在介紹執行緒同步之前,我們需要先了解一下死鎖的相關概念。
死鎖:在一組程序中的各個程序均占有不會釋放的資源,但因互相申請被其他程序所占有用不會釋放的資源而處於一種永久等待的狀態。
無論執行緒還是程序都可能出現死鎖
死鎖的四個必要條件
避免死鎖的方法
執行緒同步
想要保證執行緒同步的合理性和高效性,我們就需要用到條件變數。當乙個執行緒互斥地訪問某個變數,它可能發現在其它執行緒改變狀態之前,它什麼也做不了。例如乙個執行緒訪問佇列時,發現隊列為空,它只能等待,直到其它執行緒將乙個節點新增到佇列中。這種情況就需要用到條件變數,下面我們來看看條件變數相關的函式,這些函式真的非常像互斥鎖。
初始化條件變數:一般定義全域性變數並初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);銷毀//引數一:要初始化的條件變數 引數二:一般設定為null
int pthread_cond_destroy(pthread_cond_t *cond)在條件佇列中等待條件滿足
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);喚醒等待//引數一為要等待的條件變數,引數二為一把互斥鎖,這把鎖的用途後面講解
int pthread_cond_broadcast(pthread_cond_t *cond);//喚醒所有的條件變數,驚群問題使用條件變數例子:int pthread_cond_signal(pthread_cond_t *cond); //喚醒某乙個執行緒
此程式r2中的signal函式每隔1秒喚醒一次r1函式,所以每秒列印一次活動。
#include #include #include #include #include pthread_cond_t cond;
pthread_mutex_t mutex;
void *r1( void *arg )
} void *r2(void *arg )
} int main( void )
為什麼pthread_cond_wait函式引數需要傳互斥鎖:
pthread_mutex_lock(&mutex);
//進入臨界區訪問臨界資源
while (condition_is_false)
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
while (condition_is_false)
pthread_mutex_unlock(&mutex);
由於解鎖和等待不是原子操作。呼叫解鎖之後,pthread_ cond_ wait之前,如果已經有其他執行緒獲取到互斥量,摒棄條件滿足,傳送了訊號,那麼pthread_ cond_ wait將錯過這個訊號,可能會導致執行緒永遠阻塞在這個pthread_ cond_ wait。所以解鎖和等待必須是乙個原子操作。
條件變數使用規範
等待條件即執行緒等待
pthread_mutex_lock(&mutex);
while(條件為假)
pthread_cond_wait(cond,&mutex);
修改條件
pthread_mutex_unlock(&mutex);
給條件傳送訊號即喚醒
pthread_mutex_lock(&mutex);
設定條件為真
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
下篇部落格我們就要使用條件變數來實現經典的生產者消費者模型。 linux 執行緒 執行緒同步
因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...