1. 程式人生 > >讀者寫者之模型--同步問題

讀者寫者之模型--同步問題

場景描述:

  1. 寫者負責再資源池中寫
  2. 讀者負責從資源池中讀資料
  3. 同一時間內不允許多個寫者進行寫,但允許多個讀者進行讀
  4. 當寫者和讀者都準備佔用資源池時,寫者優先佔用資源池(此問題描述的時寫者優先順序高的場景)

建立模型

  1. 一個交易場所(資源池),此處用一個變數供讀者和寫者進行讀寫
  2. 兩種角色,一組讀者執行緒和一組寫者執行緒
  3. 三種關係:
    .讀者和寫者之間為互斥關係,寫者優先順序高
    .讀者和讀者之間為共享關係(沒有互斥關係)
    .寫者和寫者之間為互斥關係

程式碼實現

這裡採用POXI執行緒庫中的讀寫鎖來實現

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

//讀者寫者模型(讀的頻率高,寫的頻率低)

//讀者和讀者之間關係為  共享
//寫者和寫者之間關係為  互斥
//讀者和寫者之間關係為  同步互斥關係


//讀寫鎖
//讀者加讀鎖(讀者之間共享)
//寫者加寫鎖(寫者之間互斥)
//寫者優先獲取鎖(寫者優先順序高)


pthread_rwlock_t rw_lock;//定義一個讀寫鎖


//*******實現一個交易場所********************

int count;

//***********實現三種關係**********************
//實現寫著 void * Write(void * arg) { (void)arg; while(1) { usleep(1000); pthread_rwlock_wrlock(&rw_lock);//在寫之前加寫鎖 printf("寫入:%d\n",++count); pthread_rwlock_unlock(&rw_lock);//寫之後釋放鎖 usleep(7658); } return NULL; } //實現讀者 void * Read(void * arg) { (void)arg; while(1) { pthread_rwlock_rdlock(&rw_lock);//在讀之前加讀鎖
printf("讀出:%d\n",count); pthread_rwlock_unlock(&rw_lock);//讀之後釋放鎖 usleep(500); } return NULL; } //******************兩種角色******************* void test() { const int N=8; pthread_t thread[N]; int i=0; pthread_rwlock_init(&rw_lock,NULL);//對讀寫鎖進行初始化 //建立寫者執行緒 for(i=0;i<N/2;i++) { pthread_create(&thread[i],NULL,Write,NULL); } //建立讀者執行緒 for(i=0;i<N-N/2;i++) { pthread_create(&thread[i],NULL,Read,NULL); } //等待執行緒結束 for(i=0;i<N;i++) { pthread_join(thread[i],NULL); } pthread_rwlock_destroy(&rw_lock);//銷燬讀寫鎖 } int main() { test(); return 0; }

結果展示:
執行結果

我們看到寫者之間是互斥的(每次寫入的值都不同)
讀者之間是共享的(可以讀出相同的值)