條件變數本身不是鎖!但它也可以造成執行緒阻塞。通常與互斥鎖配合使用。給多執行緒提供乙個會合的場所。
pthread_cond_init函式
pthread_cond_destroy函式
pthread_cond_wait函式
pthread_cond_timedwait函式
pthread_cond_signal函式
pthread_cond_broadcast函式
以上6 個函式的返回值都是:成功返回0,失敗直接返回錯誤號。
pthread_cond_t型別 用於定義條件變數
pthread_cond_t cond;
pthread_cond_init函式
初始化乙個條件變數
intpthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t*restrict attr);
參2:attr表條件變數屬性,通常為預設值,傳null即可
也可以使用靜態初始化的方法,初始化條件變數:
pthread_cond_t cond = pthread_cond_initializer;
pthread_cond_destroy函式
銷毀乙個條件變數
int pthread_cond_destroy(pthread_cond_t*cond);
pthread_cond_wait函式
阻塞等待乙個條件變數
int pthread_cond_wait(pthread_cond_t*restrict cond, pthread_mutex_t *restrict mutex);
函式作用:
1. 阻塞等待條件變數cond(參1)滿足
2. 釋放已掌握的互斥鎖(解鎖互斥量)相當於pthread_mutex_unlock(&mutex);
1.2.
兩步為乙個原子操作。
3. 當被喚醒,pthread_cond_wait函式返回時,解除阻塞並重新申請獲取互斥鎖pthread_mutex_lock(&mutex);
pthread_cond_timedwait函式
限時等待乙個條件變數
intpthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrictmutex, const struct timespec *restrict abstime);
參3: 參看mansem_timedwait函式,檢視struct timespec結構體。
structtimespec ;
pthread_cond_timedwait (&cond,&mutex, &t); 只能定時到 2023年1月1日00:00:01秒(早已經過去)
正確用法:
time_t cur = time(null); 獲取當前時間。
struct timespec t; 定義timespec 結構體變數t
t.tv_sec = cur+1; 定時1秒
pthread_cond_timedwait (&cond, &mutex, &t); 傳參 參apue.11.6執行緒同步條件變數小節
在講解setitimer函式時我們還提到另外一種時間型別:
struct timeval ;
pthread_cond_signal函式
喚醒至少乙個阻塞在條件變數上的執行緒
intpthread_cond_signal(pthread_cond_t *cond);
pthread_cond_broadcast函式
喚醒全部阻塞在條件變數上的執行緒
int pthread_cond_broadcast(pthread_cond_t*cond);
執行緒同步典型的案例即為生產者消費者模型,而借助條件變數來實現這一模型,是比較常見的一種方法。假定有兩個執行緒,乙個模擬生產者行為,乙個模擬消費者行為。兩個執行緒同時操作乙個共享資源(一般稱之為匯聚),生產向其中新增產品,消費者從中消費掉產品。
看如下示例,使用條件變數模擬生產者、消費者問題:
/*借助條件變數模擬 生產者-消費者 問題*/#include
#include
#include
#include
/*鍊錶作為公享資料,需被互斥量保護*/
struct msg ;
struct msg *head;
struct msg *mp;
/* 靜態初始化 乙個條件變數 和 乙個互斥量*/
pthread_cond_t has_product = pthread_cond_initializer;
pthread_mutex_t lock = pthread_mutex_initializer;
void *consumer(void *p)
mp = head;
head = mp->next; //模擬消費掉乙個產品
pthread_mutex_unlock(&lock);
printf("-consume ---%d\n", mp->num);
free(mp);
mp = null;
sleep(rand() % 5);
}
}
void *producer(void *p)
}
int main(int argc, char *argv)
執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...
執行緒同步 條件變數
1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...
執行緒同步 條件變數
多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...