在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命令 ...
随机推荐
- Anaconda配置多spyder多python环境
作者:桂. 时间:2017-04-17 22:02:37 链接:http://www.cnblogs.com/xingshansi/p/6725298.html 前言 最近在看<统计学习方法 ...
- seajs加载jquery提示$ is not a function
jquery1.7以上的都支持模块化加载,只是jquery默认的是支持amd,不支持cmd.所以要用seajs加载jquery,需要稍微改下jquery 把 if (typeof define === ...
- CF #93 div1 B. Password KMP/Z
题目链接:http://codeforces.com/problemset/problem/126/B 大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串. 我自己的做法是 ...
- "fatal: protocol error: bad line length character: No This"
git clone 远程地址时候出现 "fatal: protocol error: bad line length character: No This" 错误 在stackov ...
- python——面向对象相关
其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object): pass obj = Foo( ...
- undo表空间
undo表空间undo表空间的管理,主要包括创建.删除.修改.切换.其中需要注意的是不能在undo表空间创建数据库对象,还有就是只能是单文件或大文件表空间. 创建创建主要有两种方法,一种是在创建数据库 ...
- Express - 入门
Express入门篇 1.HelloWorld 根目录新建server.js文件,插入代码: var express = require('express'); var app = express( ...
- 当谈 SQL 优化时谈些什么?
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:孙银行 背景 Mysql数据库作为数据持久化的存储系统,在实际业务中应用广泛.在应用也经常会因为SQL遇 ...
- 详解MySQL存储过程的“异常处理”
阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...