計算機操做系統基礎(十四)---線程同步之條件變量

引言

本文爲第十四篇,線程同步之條件變量,在上一篇文章是介紹了讀寫鎖,讀寫鎖在多讀少寫的狀況下,性能要強於互斥量。本篇再介紹一種重要的處理線程同步的方法---條件變量ios

條件變量

  • 條件變量是一種相對複雜的線程同步方法
  • 條件變量容許線程睡眠,直到知足某種條件
  • 當知足條件時,能夠向該線程發送信號,通知喚醒線程

對於前邊所介紹的生產者-消費者模型,實際上是有必定的漏洞的性能

  • 當緩衝區小於0時,不容許消費者消費,消費者必須等待
  • 當緩衝區滿時,不容許生產者往緩衝區生產,生產者必須等待

在前邊的文章中並無對這個進行約束,在本文學習條件變量時,將對這個進行更嚴謹的約束學習

假設此時緩衝區等於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

在快速變化的技術中尋找不變,纔是一個技術人的核心競爭力。知行合一,理論結合實踐資源

相關文章
相關標籤/搜索