在linux下利用信号量实现一个写者线程多个读者线程
#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下利用信号量实现一个写者线程多个读者线程的更多相关文章
- Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
先把代码贴上来,有时间整理一下 首先说一下要实现的功能: 假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如: [ { "id": "NEW20170 ...
- linux 下的信号量参数
linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改
原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...
- Linux下利用script命令录制并回放终端会话
Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- 【java】 linux下利用nohup后台运行jar文件包程序
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
随机推荐
- MSMQ队列学习记录
微软消息队列-MicroSoft Message Queue(MSMQ) 使用感受:简单. 一.windows安装MSMQ服务 控制面板->控制面板->所有控制面板项->程序和功能- ...
- Android 新一代多渠道打包神器
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:李涛 ApkChannelPackage是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠 ...
- python基本数据类型——int
一.int的范围 python2: 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1: 在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1: pyth ...
- 【代码学习】PHP中GD库的使用
PHP--GD库 ================================================ 一.支持: 需要php支持GD库 二.作用: 验证码.水印.缩放等 三.绘画步骤: ...
- Laravel5中Cookie的使用
今天在Laravel框架中使用Cookie的时候,碰到了点问题,自己被迷糊折腾了半多小时.期间研究了Cookie的实现类,也在网站找了许多的资料,包括问答.发现并没有解决问题.网上的答案都是互相抄袭, ...
- 解决初次使用webpack+antd-mobile时css不生效的问题
前端这块,最火的是angular.react.vue.根据你具体的业务场景,选择合适的框架或者类库.以react为例,新建一个项目时, css组件按钮,图片轮播等组件,最好不要重复造轮子,选择业内规范 ...
- Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法
[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结by edata @2017-5-1objectARX 2015 Wizard安装向导在Wi ...
- 如何在Linux实现自动运行程序
1.开机启动时 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init. init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc. ...
- Mqtt服务器搭建
.bg { background: #99CC99 } Mqtt服务器搭建 测试环境:CentOS64位 1.安装基础软件 yum install gcc-c++ yum install cmake ...
- poj2253 Frogger Dijkstra变形
题目链接:http://poj.org/problem?id=2253 就是求所有路径的最大边权值的最小值 处理时每次找出距离当前的已选的节点的最短距离,然后更新每个未选节点的值 代码: #inclu ...