在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命令 ...
随机推荐
- virtual box ubuntu 主机和虚拟机实现互相复制粘贴
链接:http://jingyan.baidu.com/article/574c521917db806c8d9dc18c.html 常规高级里共享粘贴板已经选中双向,(我的已经可以了复制粘贴了),如果 ...
- 一条SQL搞定信息增益的计算
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 周东谕,2011年加入腾讯,现任职于腾讯互娱运营部数据中心,主要从事游戏相关的数据分析和挖掘工作. 信息增益原 ...
- Go-Redis
redis的client有好多好多,go语言的client在redis官方有两个推荐,radix和redigo.选择哪一个好呢?确实很纠结,后来掷硬币决定选择redigo了. redis.go.red ...
- C# 类型转换is和as 以及性能陷阱
1.在C#2.0之前,as只能用于引用类型.而在C#2.0之后,它也可以用于可空类型.其结果为可空类型的某个值---空值或者一个有意义的值.示例: static void Main(string ...
- 数据结构与算法(c++)——跳跃表(skip list)
今天要介绍一个这样的数据结构: 单向链接 有序保存 支持添加.删除和检索操作 链表的元素查询接近线性时间 ——跳跃表 Skip List 一.普通链表 对于普通链接来说,越靠前的节点检索的时间花费越低 ...
- SparkStreaming官方示例程序运行方式
一.前置条件 安装NetCat(有“瑞士军刀”之称,简称nc),输入如下命令: yum install -y nc 二.方式一:直接运行官方Example 2.1 打开一个shell,输入命令:nc ...
- 揭秘Kafka高性能架构之道 - Kafka设计解析(六)
原创文章,同步首发自作者个人博客.转载请务必在文章开头处以超链接形式注明出处http://www.jasongj.com/kafka/high_throughput/ 摘要 上一篇文章<Kafk ...
- 一、AspNet Core通过控制台编译程序的基本指令:
1.先创建文件夹 mkdir "文件夹"2.在对应的文件夹里边 用 dotnet new 命令创建了Program.cs和project.json俩个文件3.使用 dotnet r ...
- JS模式---命令模式
var opendoor = { execute: function () { console.log("开门"); } }; var closedoor = { execute: ...
- MySQL注射的过滤绕过技巧
SQL注射的绕过技巧较多,此文仅做一些简单的总结. 最好利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可能需要暴力猜解 ...