読み书きロックを使って読者-书き手の问题を解决します.
9281 ワード
読み書きロック
読み書きロックは、データ構造に対する読み取り回数が書き込み回数よりも多い場合に適しています.読み取りモードがロックされているときに共有でき、書き込みモードでロックされているときは独占を意味します.
初期化と廃棄:
読みと書き:
コード:
読み書きロックは、データ構造に対する読み取り回数が書き込み回数よりも多い場合に適しています.読み取りモードがロックされているときに共有でき、書き込みモードでロックされているときは独占を意味します.
初期化と廃棄:
#include <pthread.h> int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
成功すると0に戻り、エラーが発生したらエラー番号を返します.同じ量以上で、読み書きロックに使われているメモリを解放する前に、pthread(u)を通過する必要があります.rwlock_destroyは読み書きロックを整理し、initによって割り当てられたリソースを解放する.読みと書き:
#include <pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
成功すれば0に戻り、エラーがあればエラー番号を返します.この3つの関数はそれぞれリードロックを取得し、書き込みロックと解除ロックを取得する操作を実現します.ロックを取得する2つの関数はブロック操作であり、ブロックではない関数は以下の通りです.#include <pthread.h> int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
成功すれば0に戻り、エラーがあればエラー番号を返します.ブロックなしの取得ロック操作で、取得できたら0に戻ります.そうでなければエラーのEBUSYを返します.コード:
/********* :
********* . ,
******** , , - .
******** 、 ;
*********/
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
//#include "apue.h"
#define R 5 // reader NO.
#define W 5 // reader and writer NO.
pthread_rwlock_t lock; //it's mean writer can writing
int readCount = 0;
void* reader(void *arg)
{
int n = W;
int id = *(int*)arg;
while (n--)
{
sleep( rand() % 3 );
pthread_rwlock_rdlock(&lock);
printf("reader %d is reading
", id);
sleep( rand() % 3 );
pthread_rwlock_unlock(&lock);
printf("reader %d is leaving
", id);
}
printf("----reader %d has done----
", id);
}
void* writer(void *arg)
{
int n = W;
while (n--)
{
sleep( rand() % 3 );
pthread_rwlock_wrlock(&lock);
printf("\twriter is writing
");
sleep( rand() % 3 );
pthread_rwlock_unlock(&lock);
printf("\twriter is leaving
");
}
printf("----writer has done----
");
}
int main(int argc, const char *argv[])
{
int err;
pthread_t tid[R], writerTid;
int i;
err = pthread_create(&writerTid, NULL, writer, (void *)NULL);
if (err != 0)
{
printf("can't create process for writer
");
}
pthread_rwlock_init(&lock, NULL);
for (i = 0; i < R; i++)
{
err = pthread_create(&tid[i], NULL, reader, &i);
if (err != 0)
{
printf("can't create process for reader");
}
}
while(1);
pthread_rwlock_destroy(&lock);
return 0;
}