歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下多任務間通信和同步-條件變量

互斥鎖的一個明顯缺點是它只有兩種狀態:鎖定和非鎖定.而條件變量通過允許線程阻塞和等待另一個線程發送信號的方法解決了互斥鎖的不足,它常此互斥鎖一起使用.使用時,條件變量被用來阻塞一個線程,當條件不滿足時,線程往往解開相應的互斥鎖並等待條件發生變化.一旦其他的某個線程改變了條件變量,它將通知相應的條件變量喚醒一個或多個正被此條件變量阻塞的線程.這些線程將重新鎖定互斥鎖並重新測試條件是否滿足.條件變量的基本操作有以下兩個:

  1. 觸發條件:當條件變為true時;
  2. 等待條件:掛起線程直到其他線程觸發條件.

注意:條件變量應該和互斥量配合使用,以避免出現條件競爭,一個線程預備等待一個條件變量,當它在真正進入等待之前,另一個線程恰好觸發了該條件.

條件變量采用的數據類型是pthread_cond_t,在使用之前必須要進行初始化,與互斥鎖類型,也包括兩種方式.

靜態初始化:可以把常量PTHREAD_COND_INITIALIZER賦給靜態分配的條件變量;

動態初始化:在申請內存(malloc)後,通過pthread_cond_init進行初始化.注意在釋放內存前需要調用pthread_cond_destory.

系統調用pthread_cond_init()

該調用將創建一個條件變量,其原型為:

#include <pthread.h>
int pthread_cond_init(pthread_cond_t*restrict cond,pthread_condattr_t *restrict attr);

當pthread_cond_init的attr參數為NULL時,會創建一個默認屬性的條件變量;非默認的條件變量需要設置條件變量屬性,我們可以參考man手冊.

系統調用pthread_cond_wait()

該系統調用對傳遞給pthread_cond_wait的互斥鎖變量cond進行保護,其原型:

int pthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t *restric mutex);

函數把調用線程放到等待條件的線程列表上,等待條件函數等待條件變為真,然後對互斥鎖解鎖,這兩個操作是原子的.這樣即使關閉了條件檢查和線程進入休眠狀態等待條件改變這兩個操作之間的事件通道,線程也不會錯過條件的任何變化.當pthread_cond_wait返回時,互斥量將再次被鎖住.

系統調用pthread_cond_timedwait()

該系統調用功能與pthread_cond_wait()函數相似,都是獲取線程的退出狀態.其原型為:

#include <pthread.h>
int pthread_cond_t timedwait(pthread_cond_t*restrict cond,
pthread-mutex_t *restrict mutex, conststruct timespec *restrict timeout);

timeout值指定了等待的事件。其數據結構structtimespec如下所示:

struct timespec{
    time_t tv_sev;    /*seconds*/
    long tvnsec;  /*nanoseconds*/
};

等待的事件值以s或ns計算,注意這是一個絕對值而不是相對值,需要將當前的事件加上需要等待的事件才是timeout的值.

系統調用pthread_cond_signal()

該系統調用線程條件已經滿足。其原型為:

#include <pthread.h>
int pthread_cond_signal(pthread_cond_t*cond);

該系統調用通知線程條件已經滿足。

 

Copyright © Linux教程網 All Rights Reserved