#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. UEFI+GPT下安装Win10+Ubuntu16.04双系统

    安装环境 SSD+HDD双盘,Win10安装在SSD里,HDD分出来60G安装Ubuntu. 自行百度你的主板是否支持UEFI启动方式. Win10 下载Win10安装镜像.烧盘等步骤就不说了,重启后 ...

  2. JavaWeb开发之HttpServletResponse

    1. HttpServletResponse简介 Web服务器回送给Web客户端的HTTP响应消息分为三个部分:状态行,响应消息头,响应体. Servlet API中定义了ServletRespons ...

  3. 新手介绍简单一下iOS开发中几种界面传值

    首先在处理iOS-UI中,也许在很多地方需要用到两种甚至多种不同界面之间的传值,相比这也是很多iOS入门成员头疼问题,同样作为新手的我在接触这类传值时候也一脸懵然,经过一段时间的研究,对于简单的传值有 ...

  4. commitProperties方法

    自定义的组件,如果重写commitProperties方法,那么在该方法内部一定要注意super.commitProperties()的调用.

  5. php操作memcache缓存基本方法

    memcache 是一个高效的分布式的内存对象缓存系统,他可以支持把php的各种数据(数组,对象,基本数据类型)放在它管理的内存中 1.代码使用 <?php //连接 $mem = new Me ...

  6. C#代码将html样式文件转为Word文档

    首先有个这样的需求,将以下网页内容下载为Word文件. html代码: <div class="modal-body">    <div style=" ...

  7. css3 felx布局

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. [css] .box ...

  8. 04(1) 基于上下文相关的GMM-HMM声学模型1

    1.上下文对音素发音的语谱轨迹的影响 受到上下文的影响,同一个音素的发音语谱轨迹不同 为提高识别准确率,对音素建模时应将这种上下文影响考虑在内 2.基于上下文相关的音素建模 注意,非单音素建模中,每个 ...

  9. cas错误:org.jasig.cas.client.validation.TicketValidationException: No principal was found in the response from the CAS server.

    这个问题困扰了我好几天,最终被这个哥们解决了,具体请参考:http://www.oschina.net/question/252484_149958?sort=time

  10. 小谈ThinkPHP

    ThinkPHP也是一个MVC框架,分视图.控制器和模型,和Yii框架相比相对较好理解,并且是轻量级的框架(相对于Yii来说),在使用Yii框架时候如果将框架放在项目文件中,用编辑器打开文件都比较慢, ...