linux读者和写者(读者优先)

缺乏、安全感 2022-02-19 18:49 364阅读 0赞

读者优先

使用互斥锁来确保同一时间只能一个进程写文件,实现互斥。使用信号量来实现访问资源的同步。

首先,写者的代码应该是这样一种形式,才能保证同一时刻只有一个写者修改数据。

考虑到写者对读者的影响是:当任何读者想读时,写者都必须被阻塞;并且,读者阻塞了写者并停止阻塞之前,后续的任何写者都会读者优先于执行。这就如同有一个读者队列,当第一个读者入队时,写者完全被阻塞,直到最后一个读者离开队列。

据此,可以用 readerCnt来统计读者的数量,而用信号量 sem_read来互斥各线程对 readerCnt的访问。

  1. /*
  2. * 多线程,读者优先
  3. */
  4. #include "stdio.h"
  5. #include <stdlib.h>
  6. #include <pthread.h>
  7. #include<semaphore.h>
  8. #define N_WRITER 30 //写者数目
  9. #define N_READER 5 //读者数目
  10. #define W_SLEEP 1 //控制写频率
  11. #define R_SLEEP 1 //控制读频率
  12. pthread_t wid[N_WRITER],rid[N_READER];
  13. pthread_mutex_t mutex_write;//同一时间只能一个人写文件,互斥
  14. sem_t sem_read;//同一时间只能有一个人访问 readerCnt
  15. int data = 0;
  16. int readerCnt = 0;
  17. void write()
  18. {
  19. int rd = rand();
  20. printf("write %d\n",rd);
  21. data = rd;
  22. }
  23. void read()
  24. {
  25. printf("read %d\n",data);
  26. }
  27. void * writer(void * in)
  28. {
  29. // while(1)
  30. // {
  31. pthread_mutex_lock(&mutex_write);
  32. printf("写线程id%d进入数据集\n",pthread_self());
  33. write();
  34. printf("写线程id%d退出数据集\n",pthread_self());
  35. pthread_mutex_unlock(&mutex_write);
  36. sleep(W_SLEEP);
  37. // }
  38. pthread_exit((void *) 0);
  39. }
  40. void * reader (void * in)
  41. {
  42. // while(1)
  43. // {
  44. sem_wait(&sem_read);
  45. readerCnt++;
  46. if(readerCnt == 1){
  47. pthread_mutex_lock(&mutex_write);
  48. }
  49. sem_post(&sem_read);
  50. printf("读线程id%d进入数据集\n",pthread_self());
  51. read();
  52. printf("读线程id%d退出数据集\n",pthread_self());
  53. sem_wait(&sem_read);
  54. readerCnt--;
  55. if(readerCnt == 0){
  56. pthread_mutex_unlock(&mutex_write);
  57. }
  58. sem_post(&sem_read);
  59. sleep(R_SLEEP);
  60. // }
  61. pthread_exit((void *) 0);
  62. }
  63. int main()
  64. {
  65. printf("多线程,读者优先\n");
  66. pthread_mutex_init(&mutex_write,NULL);
  67. sem_init(&sem_read,0,1);
  68. int i = 0;
  69. for(i = 0; i < N_WRITER; i++)
  70. {
  71. pthread_create(&wid[i],NULL,writer,NULL);
  72. }
  73. for(i = 0; i < N_READER; i++)
  74. {
  75. pthread_create(&rid[i],NULL,reader,NULL);
  76. }
  77. sleep(1);
  78. return 0;
  79. }
  80. 读者优先

发表评论

表情:
评论列表 (有 0 条评论,364人围观)

还没有评论,来说两句吧...

相关阅读

    相关 读者--问题

    读者--写者问题 问题描述 问题分析 如何实现 总结 问题描述 有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共

    相关 读者_模型

    一.读者\_写者模型 我们知道在一些程序中存在读者写者问题,就是对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,也就是具有排他性;另一种情况

    相关 Linux读者模型

    前面我们已经学过了[生产者消费者模型][Link 1],那本文就来介绍一个与它有些相似却又不同的读者写者模型。 什么是读者写者模型?   一个数据文件或记录可以被多个进

    相关 linux 读者/自旋锁

    内核提供了一个自旋锁的读者/写者形式, 直接模仿我们在本章前面见到的读者/写者旗标. 这些锁允许任何数目的读者同时进入临界区, 但是写者必须是排他的存取. 读者写者锁有 一个类