首页 > 其他分享 >多线的的同步—条件变量

多线的的同步—条件变量

时间:2023-03-26 22:57:21浏览次数:35  
标签:同步 变量 void value 多线 cond pthread mutex wait

//reader_writer.c

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

/* 写者写完通知读者去读
读者读完通知写者去写 */

typedef struct{
    int value;
    
    int r_wait;
    pthread_mutex_t r_mutex;
    pthread_cond_t r_cond;
    
    int w_wait;
    pthread_mutex_t w_mutex;
    pthread_cond_t w_cond;
}Storage;

void set_value(Storage *s, int value)
{
    s->value = value;
}

int get_value(Storage *s)
{
    return s->value;
}

void *set_fn(void *arg)
{
    Storage *s = (Storage *)arg;
    int i = 0;
    for(; i < 100; i++){
        set_value(s, i+100);
        printf("writer write %d\n",i+100);
        pthread_mutex_lock(&s->r_mutex);
        //判断读者是否调用wait函数,如果调用了wait函数,那么写者就调用broadcast唤醒读者
        while(s->r_wait == 0){
            pthread_mutex_unlock(&s->r_mutex);
            sleep(1);
            pthread_mutex_lock(&s->r_mutex);
        }
        s->r_wait = 0;
        pthread_mutex_unlock(&s->r_mutex);
        pthread_cond_broadcast(&s->r_cond);
        
        //设置写者调用了wait函数,等待读者通知
        pthread_mutex_lock(&s->w_mutex);
        s->w_wait = 1;
        pthread_cond_wait(&s->w_cond, &s->w_mutex);
        pthread_mutex_unlock(&s->w_mutex);
    }
    
    return (void *)0;
}

void *get_fn(void *arg)
{
    Storage *s = (Storage *)arg;
    int i = 0;
    for(; i < 100; i++){
        //设置读者调用了wait函数,等待写者通知(r_wait和读者的wait函数绑定,1表示调用了wait函数)
        pthread_mutex_lock(&s->r_mutex);
        s->r_wait = 1;
        pthread_cond_wait(&s->r_cond, &s->r_mutex);
        pthread_mutex_unlock(&s->r_mutex);
        printf("reader read %d\n",get_value(s));
        
        //读者通知写者再写
        pthread_mutex_lock(&s->w_mutex);
        while(s->w_wait == 0){
            pthread_mutex_unlock(&s->w_mutex);
            sleep(1);
            pthread_mutex_lock(&s->w_mutex);
        }
        s->w_wait = 0;
        pthread_mutex_unlock(&s->w_mutex);
        pthread_cond_broadcast(&s->w_cond);
    }
    
    return (void *)0;
}

int main()
{
    pthread_t reader,writer;
    
    Storage s;
    s.r_wait = 0;
    pthread_mutex_init(&s.r_mutex, NULL);
    pthread_cond_init(&s.r_cond, NULL);
    
    s.w_wait = 0;
    pthread_mutex_init(&s.w_mutex, NULL);
    pthread_cond_init(&s.w_cond, NULL);
    
    if(pthread_create(&reader, NULL, get_fn, (void *)&s) < 0){
        printf("pthread_create failed\n");
    }
    
    if(pthread_create(&writer, NULL, set_fn, (void *)&s) < 0){
        printf("pthread_create failed\n");
    }
    
    pthread_join(reader, NULL);
    pthread_join(writer, NULL);
    
    pthread_mutex_destroy(&s.r_mutex);
    pthread_mutex_destroy(&s.w_mutex);
    
    pthread_cond_destroy(&s.r_cond);
    pthread_cond_destroy(&s.w_cond);
    
    return 0;
}

 

标签:同步,变量,void,value,多线,cond,pthread,mutex,wait
From: https://www.cnblogs.com/zj-studyrecoding/p/17259850.html

相关文章

  • Python多任务-多线程-多进程-协程-进阶学习
    --多任务-多线程-多进程-协程-进阶学习--文中所提到的案例参考:GITHUB中项目文件夹https://github.com/FangbaiZhang/Python_advanced_learning/tree/master/02_Python_ad......
  • 轻松管理笔记,云端实现同步:Ihome主页插件的云笔记功能介绍
    IHome主页插件是一款方便实用的浏览器扩展,可以帮助用户快速访问常用的网站、应用和工具,提高上网效率和使用体验。它可以自定义主页,支持多种主题和布局,同时还提供了各种实用......
  • Task 类 多线程
    Task类定义命名空间: System.Threading.Tasks程序集:System.Runtime.dll表示一个异步操作publicclassTask:IAsyncResult,IDisposable继承  Object->Task......
  • 实验1 同步与异步write的效率比较
    Unix实验报告实验:实验1同步与异步write的效率比较专业:计算机科学与技术班级:1班姓名:姚怀聿学号:229202022046322022年10月7......
  • 半同步复制
    半同步复制一、半同步复制1、什么是半同步复制所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志......
  • azul zulu OpenJDK 17 下载安装及配置环境变量
    2023/03/26,OpenJDK17.0.6,AzulZulu17.40.19摘要:azulzuluOpenJDK17下载安装及配置环境变量OpenJDK下载与安装下载在azul官网选择对应的jdk版本安装将下......
  • 多线程的互斥—读写锁
    //account.h#ifndef_ACCOUNT_H#define_ACCOUNT_H#include<pthread.h>typedefstruct{intcode;doublebalance;//定义一把互斥锁,用......
  • 中国石油大学(北京)第三届“骏码杯”程序设计竞赛(同步赛)
    Preface前两天刚买了个U盘,然后今天又水了一个(乐做完签到感觉F很一眼,结果一个特判重复出现两次的地方写挂了,苦苦白调一个小时(甚至被迫在ACM比赛里写对拍)然后赶紧把本质很......
  • 多线程的并发—互斥锁(互斥量)
    //account.h#ifndef_ACCOUNT_H#define_ACCOUNT_H#include<pthread.h>typedefstruct{intcode;doublebalance;//定义一把互斥锁,用......
  • 2、变量
    1、含义变量本质上就是一小块内存,用于存储数据,在程序的运行中数值是可以改变的2、声明变量1、方式一:先定义再赋值//方式一:先定义再赋值varainta=10fmt.Prin......