#include<pthread.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<semaphore.h>
typedef struct
{
int value;
sem_t sem,semw;// 信号量要和共享资源相互"绑定"
int sign;
}Storage;
void set_data(Storage *s,int value)
{
s->value=value;
} int get_data(Storage* s)
{
return s->value;
} void* rd1_fn(void *arg)
{
Storage *s=(Storage*)arg;
int i=;
for(;i<;i++)
{
sem_wait(&s->sem);//实现读线程与写线程的同步
s->sign++;
int value=get_data(s);
sleep();
printf("rd1(0x)%lx read data :%d\n",pthread_self(),value);
if(s->sign!=)
sem_post(&s->sem);//实现读线程之间的互斥
else
sem_post(&s->semw);//实现写线程与读线程的同步
// usleep(100);
sleep();
}
return (void*);
}
void* rd2_fn(void *arg)
{
Storage *s=(Storage*)arg;
int i=;
for(;i<;i++)
{
sem_wait(&s->sem);
s->sign++;
int value=get_data(s);
sleep();
printf("rd2(0x)%lx read data :%d\n",pthread_self(),value);
if(s->sign!=)
sem_post(&s->sem);
else
sem_post(&s->semw);
// usleep(100);
sleep();
}
return (void*);
}
void* rd3_fn(void *arg)
{
Storage *s=(Storage*)arg;
int i=;
for(;i<;i++)
{
sem_wait(&s->sem);
s->sign++;
int value=get_data(s);
sleep();
printf("rd3(0x)%lx read data :%d\n",pthread_self(),value);
if(s->sign!=)
sem_post(&s->sem);
else
sem_post(&s->semw);
// usleep(100);
sleep();
}
return (void*);
} void* wt_fn(void *arg)
{
Storage *s=(Storage*)arg;
int i=;
for(;i<;i++)
{
sem_wait(&s->semw);//实现for循环里写线程的互斥
s->sign=;
set_data(s,i+);
sleep();
printf("wt(0x)%lx wrote data :%d\n",pthread_self(),i+);
sem_post(&s->sem);//实现写线程与读线程的同步
sleep();
// sleep(5);
}
return (void*);
}
int main(void)
{
int err;
pthread_t rd1,rd2,rd3,wt;
Storage s;
s.value=;
s.sign=;
sem_init(&s.sem,,);//初始化为0
sem_init(&s.semw,,);//初始化为1
pthread_create(&rd1,NULL,rd1_fn,(void*)&s);
pthread_create(&rd2,NULL,rd2_fn,(void*)&s);
pthread_create(&rd3,NULL,rd3_fn,(void*)&s);
pthread_create(&wt,NULL,wt_fn,(void*)&s);
pthread_join(rd1,NULL);
pthread_join(rd2,NULL);
pthread_join(rd3,NULL);
pthread_join(wt,NULL);
sem_destroy(&s.sem);
sem_destroy(&s.semw);
return ;
}

利用两个信号量 实现了写者之间的互斥,读者之间的互斥,读者和写者之间的同步。 若要实现多个写者,只需按照多个读者的思路写即可。

在linux下利用信号量实现一个写者线程多个读者线程的更多相关文章

  1. Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组

    先把代码贴上来,有时间整理一下 首先说一下要实现的功能: 假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如: [ { "id": "NEW20170 ...

  2. linux 下的信号量参数

    linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...

  3. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  4. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  5. linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改

    原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...

  6. Linux下利用script命令录制并回放终端会话

    Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...

  7. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  8. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  9. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

随机推荐

  1. php 启动过程 - reqeust RINIT 过程

    php 启动过程 - reqeust RINIT 过程 概述 apache 接收到请求之后, 交给 php 处理 php 模块在接收到请求后, 会对请求进行初始化, 及 RINIT 过程 调用触发 a ...

  2. 一个全局变量引起的DLL崩溃

    参考我发的帖子: http://bbs.csdn.net/topics/390737064?page=1#post-397000946 现象是exe程序在加载dll的时候崩溃了,莫名其妙的崩溃了.换其 ...

  3. Python全栈之路-Day31

    1 反射 反射的精髓是通过字符串去获取对象属性的值 1.1 基于类和对象反射的属性 #!/usr/bin/env python # __Author__: "wanyongzhen" ...

  4. eharts入门篇一

    1.导入文件样式 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载完整版本. 2,引入 ECharts 文件  < ...

  5. CSS3弹性伸缩布局(中)——flexbox布局

    混合过渡版 上一篇我们主要讲了旧版box布局,今天这篇主要讲flexbox布局. 混合版本的Flexbox模型是2011年提出的工作草案,主要是针对IE10浏览器实现的伸缩布局效果,其功能和旧版本的功 ...

  6. 蓝桥杯-马虎的算式-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  7. postgres导入其他数据库数据

    最近对postgres数据库进行深入研究,将原来项目中使用的sqlserver数据库中的数据表导入postgres,网上搜索postgres数据导入,除空间数据库可以通过PostGIS 2.0 Sha ...

  8. GitHub的实践

    GitHub的实践 2017-05-08,晴,来小米已经一周的时间了,感谢领导能给我一周的时间来熟悉 ubuntu.spring boot.maven.docker.github .大家会问,这些不都 ...

  9. Excel 数据导入(OleDb)

    @using (Html.BeginForm("Student", "Excel", FormMethod.Post, new { enctype = &quo ...

  10. 使用bootstrap的插件实现模态框效果

    在上一篇文章中,我们使用 js+css 实现了模态框效果,在理解了模态框的基本实现方法和实现效果后,我们就要寻找更快捷的方法,又快又好的来完成模态框开发需求,从而节约时间,提高效率.一个好的轮子,不仅 ...