一、條件變數基本原理
條件變數可以使執行緒睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待「條件變數的條件成立」而掛起;另乙個執行緒使「條件成立」(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。
二、條件變數操作流程
1.定義互斥鎖、條件變數;
2.初始化互斥鎖、條件變數;
3.建立執行緒;
4.條件不成立,執行緒進入睡眠狀態;
5.另一線程在條件成立是喚醒睡眠的執行緒(可能不止乙個執行緒);
6.執行緒退出,釋放資源(銷毀互斥鎖、條件變數)。
三、條件變數基本操作函式
互斥鎖基本操作函式如下表所示:
1.初始化條件變數
在使用條件變數前,需要定義該條件變數(全域性變數),定義條件變數**如下:
pthread_cond_t condtion
pthread_cond_init()
函式用來初始化條件變數,其函式申明如下:
int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t* cond_attr);
第1個引數cond指向要初始化的條件變數指標;
第2個引數cond_attr指向屬性物件的指標,該屬性物件定義要初始化的條件變數的特性,如果該指標為null,則使用預設的屬性。下面是一段初始化條件變數的**:
函式執行成功時返回0。否則,返回錯誤編碼號以指明錯誤。pthread_cond_t cv;
pthread_condattr_t cattr;
int ret;
ret = pthread_cond_init(&cv, null); // 使用預設屬性初始化條件變數
ret = pthread_cond_init(&cv, &cattr); // 使用自定義屬性初始化條件變數
2.等待條件變數
pthread_cond_wait()
函式阻塞等待某個條件變數,其函式宣告如下:
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
第1個引數cond是指向要等待的條件變數的指標;
第2個引數mutex是指向與條件變數cond關聯的互斥鎖的指標。
pthread_cond_timedwait()
函式阻塞等待某個條件變數,其函式宣告如下:
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex, struct timespec* abstime);
第1個引數cond是指向要等待的條件變數的指標;
第2個引數mutex是指向與條件變數cond關聯的互斥鎖的指標。
第3個引數abstime是等待過期的絕對時間,該時間為從1970-1-1:0:0:0以來的秒數,即為乙個絕對時間。該資料結構宣告如下:
struct timespec ;
兩函式執行成功時返回0。否則,返回錯誤編碼號以指明錯誤。
3.通知等待條件變數的執行緒
pthread_cond_signal()
函式用來通知等待條件變數的第乙個執行緒。pthread_cond_broadcast()
函式用來通知等待條件變數的所以執行緒。兩函式的宣告如下:
引數cond是指向要通知或者廣播的條件變數的指標。int pthread_cond_signal(pthread_cond_t* cond);
int pthread_cond_broadcast(pthread_cond_t* cond);
兩函式執行成功時返回0。否則,返回錯誤編碼號以指明錯誤。
4.條件變數銷毀
pthread_cond_destroy()
函式用來銷毀條件變數,其函式申明如下:
int pthread_cond_destroy(pthread_cond_t* cond);
引數cond指向要銷毀的條件變數的指標。
函式執行成功時返回0。否則,返回錯誤編碼號以指明錯誤。
四、條件變數常規操作
下面給出條件變數常規操作:
五、示例初始狀態有#include
static pthread_mutex_t mutex; /*互斥鎖*/
static pthread_cond_t cond; /*條件變數*/
/*** 初始化條件變數
*/void init_cond(void)
/*** 銷毀條件變數
*/void destroy_cond(void)
/*** 獲取條件變數,使當前執行緒進入睡眠狀態
*/void get_cond(void)
/*** 喚醒等待條件變數進入睡眠的執行緒
*/void wakeup_cond(void)
i=3, j=7
,a執行緒執行i++; j--;
操作。b執行緒只有在i == j
時執行do_somethind();
函式,下面通過條件變數來解決此問題:
如上圖所示執行緒b獲得cpu資源時條件不成立,進入休眠狀態,當執行緒a執行到#include #include int i = 3;
int j = 7;
static pthread_mutex_t mutex; /*互斥鎖*/
static pthread_cond_t cond; /*條件變數*/
/*** 初始化條件變數
*/void init_cond(void)
/*** 釋放條件變數
*/void destroy_cond(void)
/*** 獲取條件變數,使當前執行緒進入睡眠狀態
*/void get_cond(void)
/*** 喚醒等待條件變數進入睡眠的執行緒
*/void wakeup_cond(void)
void do_something()
void* pth_a(void* arg)
i++;
j--;
sleep(1);
}pthread_exit(0);
}void* pth_b(void* arg)
if (i == j)
}pthread_exit(0);
}int main()
ret = pthread_create(&tidb, null, pth_b, null);
if (0 != ret)
pthread_join(tida, null);
pthread_join(tidb, null);
// 銷毀鎖
destroy_cond();
return
0;}
i == j
時便喚醒b執行緒。b執行緒被喚醒時條件成立,便呼叫了函式do_something()
。 Linux環境程式設計之同步 二 條件變數
相互排斥鎖用於上鎖,條件變數則用於等待。條件變數是型別為pthread cond t的變數。一般使用例如以下函式 include int pthread cond wait pthread cond t cptr,pthread mutex t mptr int pthread cond signa...
二 條件迴圈語句
1 查詢那些既可以被7整除又可以被5整除的數字,介於1500和2700之間 1 使用列表推導式 num i for i in range 1500 2700 if i 7 0and i 5 0 print num out 1505,1540,1575,1610,1645,1680,1715,1750...
(4 2)Linux執行緒同步機制 條件變數
1 任務同步 相互合作關係 直接相互制約的關係 1 程式設計中存在這樣的情況 多個執行緒都要訪問臨界資源又要相互合作 執行緒間同時存在互斥關係和同步關係 2 執行緒a 先執行某操作 例如 對全域性變數x 的修改 後,執行緒b才能 根據變數x 的值判斷 執行另一操作 可能是 對全域性變數x 的修改 該...