1. #include<pthread.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<stdio.h>
  5. #include<semaphore.h>
  6. typedef struct
  7. {
  8. int value;
  9. sem_t sem,semw;// 信号量要和共享资源相互"绑定"
  10. int sign;
  11. }Storage;
  12. void set_data(Storage *s,int value)
  13. {
  14. s->value=value;
  15. }
  16.  
  17. int get_data(Storage* s)
  18. {
  19. return s->value;
  20. }
  21.  
  22. void* rd1_fn(void *arg)
  23. {
  24. Storage *s=(Storage*)arg;
  25. int i=;
  26. for(;i<;i++)
  27. {
  28. sem_wait(&s->sem);//实现读线程与写线程的同步
  29. s->sign++;
  30. int value=get_data(s);
  31. sleep();
  32. printf("rd1(0x)%lx read data :%d\n",pthread_self(),value);
  33. if(s->sign!=)
  34. sem_post(&s->sem);//实现读线程之间的互斥
  35. else
  36. sem_post(&s->semw);//实现写线程与读线程的同步
  37. // usleep(100);
  38. sleep();
  39. }
  40. return (void*);
  41. }
  42. void* rd2_fn(void *arg)
  43. {
  44. Storage *s=(Storage*)arg;
  45. int i=;
  46. for(;i<;i++)
  47. {
  48. sem_wait(&s->sem);
  49. s->sign++;
  50. int value=get_data(s);
  51. sleep();
  52. printf("rd2(0x)%lx read data :%d\n",pthread_self(),value);
  53. if(s->sign!=)
  54. sem_post(&s->sem);
  55. else
  56. sem_post(&s->semw);
  57. // usleep(100);
  58. sleep();
  59. }
  60. return (void*);
  61. }
  62. void* rd3_fn(void *arg)
  63. {
  64. Storage *s=(Storage*)arg;
  65. int i=;
  66. for(;i<;i++)
  67. {
  68. sem_wait(&s->sem);
  69. s->sign++;
  70. int value=get_data(s);
  71. sleep();
  72. printf("rd3(0x)%lx read data :%d\n",pthread_self(),value);
  73. if(s->sign!=)
  74. sem_post(&s->sem);
  75. else
  76. sem_post(&s->semw);
  77. // usleep(100);
  78. sleep();
  79. }
  80. return (void*);
  81. }
  82.  
  83. void* wt_fn(void *arg)
  84. {
  85. Storage *s=(Storage*)arg;
  86. int i=;
  87. for(;i<;i++)
  88. {
  89. sem_wait(&s->semw);//实现for循环里写线程的互斥
  90. s->sign=;
  91. set_data(s,i+);
  92. sleep();
  93. printf("wt(0x)%lx wrote data :%d\n",pthread_self(),i+);
  94. sem_post(&s->sem);//实现写线程与读线程的同步
  95. sleep();
  96. // sleep(5);
  97. }
  98. return (void*);
  99. }
  100. int main(void)
  101. {
  102. int err;
  103. pthread_t rd1,rd2,rd3,wt;
  104. Storage s;
  105. s.value=;
  106. s.sign=;
  107. sem_init(&s.sem,,);//初始化为0
  108. sem_init(&s.semw,,);//初始化为1
  109. pthread_create(&rd1,NULL,rd1_fn,(void*)&s);
  110. pthread_create(&rd2,NULL,rd2_fn,(void*)&s);
  111. pthread_create(&rd3,NULL,rd3_fn,(void*)&s);
  112. pthread_create(&wt,NULL,wt_fn,(void*)&s);
  113. pthread_join(rd1,NULL);
  114. pthread_join(rd2,NULL);
  115. pthread_join(rd3,NULL);
  116. pthread_join(wt,NULL);
  117. sem_destroy(&s.sem);
  118. sem_destroy(&s.semw);
  119. return ;
  120. }

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

在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. Anaconda配置多spyder多python环境

    作者:桂. 时间:2017-04-17  22:02:37 链接:http://www.cnblogs.com/xingshansi/p/6725298.html  前言 最近在看<统计学习方法 ...

  2. seajs加载jquery提示$ is not a function

    jquery1.7以上的都支持模块化加载,只是jquery默认的是支持amd,不支持cmd.所以要用seajs加载jquery,需要稍微改下jquery 把 if (typeof define === ...

  3. CF #93 div1 B. Password KMP/Z

    题目链接:http://codeforces.com/problemset/problem/126/B 大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串. 我自己的做法是 ...

  4. "fatal: protocol error: bad line length character: No This"

    git clone 远程地址时候出现 "fatal: protocol error: bad line length character: No This" 错误 在stackov ...

  5. python——面向对象相关

    其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object):     pass   obj = Foo( ...

  6. undo表空间

    undo表空间undo表空间的管理,主要包括创建.删除.修改.切换.其中需要注意的是不能在undo表空间创建数据库对象,还有就是只能是单文件或大文件表空间. 创建创建主要有两种方法,一种是在创建数据库 ...

  7. Express - 入门

    Express入门篇 1.HelloWorld  根目录新建server.js文件,插入代码: var express = require('express'); var app = express( ...

  8. 当谈 SQL 优化时谈些什么?

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:孙银行 背景 Mysql数据库作为数据持久化的存储系统,在实际业务中应用广泛.在应用也经常会因为SQL遇 ...

  9. 详解MySQL存储过程的“异常处理”

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  10. 整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...