【Linux】読み書きロック!!

4059 ワード

読み書きロックの三二一モデル
  • 三:三つの関係、読者と読者の間に関係がない、書く者と読者が反発し、同期し、書く者と書く者の間で反発する
  • .
  • 2 2:2つのオブジェクト、読者、およびライター
  • 一:取引場所の読み書きロックアプリケーションのシーン:マルチスレッドプログラムでは、スレッドの臨界リソースへのアクセスが多く、臨界リソースへの修正が少ない.

  • 読み書きモデルでは,書き込み操作の回数が少ない.では,このモデルでの書き込み操作の優先度は必読操作の優先度が高い.読み込みの優先度が書き込みの優先度よりも高いと、読み取り操作がずっと読んでいて、書き込み操作が飢餓する現象が発生します.
    読み書きロックタイプ: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; }