Linux執行緒同步機制二 條件變數cond

2021-08-04 20:57:58 字數 3982 閱讀 5463

一、條件變數基本原理

條件變數可以使執行緒睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待「條件變數的條件成立」而掛起;另乙個執行緒使「條件成立」(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。

二、條件變數操作流程

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,則使用預設的屬性。下面是一段初始化條件變數的**:

pthread_cond_t cv;

pthread_condattr_t cattr;

int ret;

ret = pthread_cond_init(&cv, null); // 使用預設屬性初始化條件變數

ret = pthread_cond_init(&cv, &cattr); // 使用自定義屬性初始化條件變數

函式執行成功時返回0。否則,返回錯誤編碼號以指明錯誤。

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()函式用來通知等待條件變數的所以執行緒。兩函式的宣告如下:

int pthread_cond_signal(pthread_cond_t* cond);

int pthread_cond_broadcast(pthread_cond_t* cond);

引數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();函式,下面通過條件變數來解決此問題:

#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;}

如上圖所示執行緒b獲得cpu資源時條件不成立,進入休眠狀態,當執行緒a執行到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 的修改 該...