【Linux】読み書きロック!!
4059 ワード
読み書きロックの三二一モデル三:三つの関係、読者と読者の間に関係がない、書く者と読者が反発し、同期し、書く者と書く者の間で反発する . 2 2:2つのオブジェクト、読者、およびライター 一:取引場所の読み書きロックアプリケーションのシーン:マルチスレッドプログラムでは、スレッドの臨界リソースへのアクセスが多く、臨界リソースへの修正が少ない.
読み書きモデルでは,書き込み操作の回数が少ない.では,このモデルでの書き込み操作の優先度は必読操作の優先度が高い.読み込みの優先度が書き込みの優先度よりも高いと、読み取り操作がずっと読んでいて、書き込み操作が飢餓する現象が発生します.
読み書きロックタイプ:pthread_rwlock_t
読み書きロックの初期化と破棄
読み書きロックのロックとロック解除
例:
読み書きモデルでは,書き込み操作の回数が少ない.では,このモデルでの書き込み操作の優先度は必読操作の優先度が高い.読み込みの優先度が書き込みの優先度よりも高いと、読み取り操作がずっと読んでいて、書き込み操作が飢餓する現象が発生します.
読み書きロックタイプ:pthread_rwlock_t
読み書きロックの初期化と破棄
#include
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
読み書きロックのロックとロック解除
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
例:
#include
#include
#include
pthread_rwlock_t lock;
int count = 0;
void* route_read(void* arg){
int id = (int)arg;
int t = count;
while(1){
usleep(100000);
pthread_rwlock_rdlock(&lock);
printf("tid = %x id = %d t = %d count = %d
",pthread_self(),id,t,count);
pthread_rwlock_unlock(&lock);
sleep(1);
}
}
void* route_write(void* arg){
int id = (int)arg;
int t = count;
while(1){
usleep(100000);
pthread_rwlock_wrlock(&lock);
printf("tid = %x id = %d t = %d ++count = %d
",pthread_self(),id,t,++count);
pthread_rwlock_unlock(&lock);
sleep(1);
}
}
int main(){
pthread_t id[8];
int i = 0;
pthread_rwlock_init(&lock,NULL);
for(;i<3;i++){
pthread_create(&id[i],NULL,route_write,(void*)i);
}
for(i=3;i<8;i++){
pthread_create(&id[i],NULL,route_read,(void*)i);
}
for(i=0;i<8;i++)
pthread_join(id[i],NULL);
return 0;
}