條件變數的使用方法(筆記)

2021-10-04 05:23:06 字數 2116 閱讀 7716

初始化乙個條件變數

#include int pthread_cond_init(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

常量初始化

pthread_cond_t cond = pthread_cond_initializer;
摧毀乙個條件變數

#include int pthread_cond_destroy(pthread_cond_t *cond);
條件變數阻塞等待

#include int pthread_cond_wait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex);

先釋放鎖 mutex

阻塞在 cond 條件變數上

超時等待

#include int pthread_cond_timedwait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex,

const struct timespec *restrict abstime);

struct timespec 

abstime --- 絕對時間,tv_sec填寫的時候 time(null)+600 --- 設定超時600s

喚醒至少乙個阻塞在條件變數cond上的執行緒

#include int pthread_cond_signal(pthread_cond_t *cond);
喚醒阻塞在條件變數cond上的全部執行緒

#include int pthread_cond_broadcast(pthread_cond_t *cond);
條件變數的作用:避免無必要的競爭

即使沒有執行緒通知條件變數,執行緒也可能從其等待狀態喚醒。

wait方法分為三個操作:

-釋放鎖並阻塞

-等待條件cond發生

-獲取通知後,競爭獲取鎖

-wait只有獲取到鎖以後才會返回

當執行緒a獲取通知後,會競爭獲取鎖,若鎖被執行緒c獲取並改變了條件變數的條件,那麼當a重新拿到鎖後會繼續執行後面的操作,然而此時條件不允許執行後面的操作。

條件變數只有一種正確的使用方式:

對於wait端:

- 必須與mutex一起使用,該布林表示式的讀寫需受此mutex保護。

- 在mutex已上鎖的時候才能呼叫wait()

- 把判斷布林條件和wait()放到while迴圈中

int dequeue()

assert(!queue.empty());

int top = queue.front();

queue.pop_front();

return top;

}

對於signal/broadcast端:

- 不一定在mutex已上鎖的情況下呼叫signal(理論上)

- 在signal之前一般要修改布林表示式

- 修改布林表示式通常要用mutex保護(至少用作full memory barrier)

- 注意區分signal與broadcast:broadcast通常用於表明狀態變化,signal通常用於表示資源可用。

void enqueue(int x)

條件CSS基本使用方法

毫無疑問,任何乙個試圖使用 css 的網頁設計師和開發人員都會發現不同的瀏覽器要求不同的樣式宣告。這些煩惱歸咎於各瀏覽器及其各版本不同程度的 css 執行的完整性。條件 css 是這個問題的乙個解決方案,採用的是 internet explorer 的條件注釋語法的思想,並把它內聯到 css 宣告之...

Css 變數使用方法

doctype html en utf 8 viewport content width device width,initial scale 1.0 document title root 全域性定義 root 使用方法 myvarible after可以在元素的後面加入內容 myvarible ...

crontab 環境變數的使用方法

環境 產品,平台,機型,軟體版本,等 aix5l 問題描述 crontab中啟動的shell指令碼不能正常執行,但是使用手動執行沒有問題,在 home profile中設定了指令碼所需要的環境變數。解答 cron命令的預設shell是 usr bin bsh,如果要在cron啟動的指令碼中使用ksh...