本文爲第十四篇,線程同步之條件變量,在上一篇文章是介紹了讀寫鎖,讀寫鎖在多讀少寫的狀況下,性能要強於互斥量。本篇再介紹一種重要的處理線程同步的方法---條件變量ios
對於前邊所介紹的生產者-消費者模型,實際上是有必定的漏洞的性能
在前邊的文章中並無對這個進行約束,在本文學習條件變量時,將對這個進行更嚴謹的約束學習
假設此時緩衝區等於0,當生產者生產一個產品時,喚醒可能等待的消費者。假設緩衝區滿時,當消費者消費一個產品時,喚醒可能等待的生產者spa
條件變量的示例(須要配合互斥量來使用)線程
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<pthread.h> #include<vector> #include<queue> //臨界資源 int num=0; //緩衝區最大值 int MAX_BUF=100; //定義條件變量 pthread_cond_t cond=PTHREAD_COND_INITIALIZER; //定義互斥量 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; void* producer(void*){ while(true){ pthread_mutex_lock(&mutex); while(num>=MAX_BUF){ //等待 pthread_cond_wait(&cond, &mutex); printf("緩衝區滿了,等待消費者消費\n"); } num+=1; printf("生產一個產品,當前產品數量爲:%d", num); sleep(1);//生產產品所需時間 //通知可能等待的消費者 pthread_cond_signal(&cond); printf("通知消費者...\n"); //解鎖 pthread_mutex_unlock(&mutex); sleep(1);生產產品的頻率 } } void* consumer(void*){ while(true){ pthread_mutex_lock(&mutex); while(num<=0){ //等待 pthread_cond_wait(&cond, &mutex); printf("緩衝區空了,等待生產者生產\n"); } num-=1; printf("消費一個產品,當前產品數量爲:%d", num); sleep(1); //通知可能等待的生產者 pthread_cond_signal(&cond); printf("通知生產者...\n"); //解鎖 pthread_mutex_unlock(&mutex); } } int main() { //定義兩個線程 pthread_t thread1,thread2; //一個執行生產者邏輯,一個執行消費者邏輯 pthread_create(&thread1, NULL, &producer, NULL); pthread_create(&thread2, NULL, &consumer, NULL); pthread_join(&thread1, NULL); pthread_join(&thread2, NULL); return 0; }
執行結果:
code
在快速變化的技術中尋找不變,纔是一個技術人的核心競爭力。知行合一,理論結合實踐資源