讀者寫者之模型--同步問題
阿新 • • 發佈:2019-01-24
場景描述:
- 寫者負責再資源池中寫
- 讀者負責從資源池中讀資料
- 同一時間內不允許多個寫者進行寫,但允許多個讀者進行讀
- 當寫者和讀者都準備佔用資源池時,寫者優先佔用資源池(此問題描述的時寫者優先順序高的場景)
建立模型
- 一個交易場所(資源池),此處用一個變數供讀者和寫者進行讀寫
- 兩種角色,一組讀者執行緒和一組寫者執行緒
- 三種關係:
.讀者和寫者之間為互斥關係,寫者優先順序高
.讀者和讀者之間為共享關係(沒有互斥關係)
.寫者和寫者之間為互斥關係
程式碼實現
這裡採用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;
}
結果展示:
我們看到寫者之間是互斥的(每次寫入的值都不同)
讀者之間是共享的(可以讀出相同的值)