【C/C++マルチスレッドプログラミングの9】pthread読み書きロック


マルチスレッドプログラミングの読み書きロック
     
Pthread
POSIX threadsの略称で、POSIXの
スレッド基準
.
pthread読み書きロックは共有リソースに対するアクセス者を読者とライターに分け,読者は共有リソースにのみ読み書きアクセスし,ライターは共有リソースにのみ書き込み操作を行う.反発メカニズムでは、読者と書き込み者が共有リソースを独占するために独立した反発量を独占する必要があり、読み書きロックメカニズムの下で、同時に複数の読者が共有リソースにアクセスすることを許可し、書き込み者だけがリソースを独占する必要がある.反発メカニズムに比べて、読み書きメカニズムは、複数の読者が共有リソースに同時に読みアクセスできるようにするため、マルチスレッドの同時性をさらに向上させる.
         
       1.読み書きロック機構:
書き込み者:書き込み者は書き込みロックを使用し、現在読者がいなければ、他の書き込み者もいなければ、書き込み者はすぐに書き込みロックを取得します.そうでなければ、読者と書く人がいないまで、書く人は待っています.
読者:読者はリードロックを使用し、現在書いていない場合は、読者はすぐにリードロックを取得します.そうでなければ、読者は書く人がいないまで待っています.
           
          
2.読み書きロックの特性:
書き込みロックは、同じ時点で1つのスレッドのみで取得でき、同じ時点で複数のスレッドが読み取りロックを取得できます.
読み書きロックが書き込みロック状態にある場合、読み書きロックにロックをかけようとするスレッドは、読者が読み書きロックをかけようとしても、書き手が書き込みロックをかけようとしてもブロックされます.
リード・ライト・ロックがリード・ロック状態にある場合、書き込み者がライト・ロックを追加しようとすると、その後の他のスレッドのリード・ロック要求がブロックされ、書き込み者の長時間の非書き込みロックが回避されます.
        
        3.読み書きロック基本関数:
         # include
読み書きロックの初期化:
        int pthread_rwlock_init(pthread_rwlock_t * rwlock, 
                                                 const pthread_rwlockattr_t *  attr);
この関数の最初のパラメータは読み書きロックポインタであり、2番目のパラメータは読み書きロック属性ポインタである.関数は、読み書きロックのプロパティに従って読み書きロックを初期化します.
読み込みロック:
        int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
この関数パラメータは、読み書きロックポインタです.関数は、読み書きロックに読み書きロックを追加するために使用します.
書き込みロック:
        int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
この関数パラメータは、読み書きロックポインタです.関数は、読み書きロックに書き込みロックを追加するために使用します.
読み書きロックを解除するには、次の手順に従います.
        int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
この関数パラメータは、読み書きロックポインタです.関数は、リード・ライト・ロックを解放するために使用されます.リード・ロックとライト・ロックが含まれます.
読み書きロックを破棄するには、次の手順に従います.
        int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
この関数パラメータは、読み書きロックポインタです.関数を使用して、読み書きロックを破棄します.
        4.牛刀小試験:
例:リードライトロックを使用して、共有リソースdataをリードライト同期し、スレッドreaderM、readerNを読者スレッド、スレッドwriterA、writerBをライタースレッドとする.      
#include 
#include 
#include 
#include 
#pragma comment(lib, "pthreadVC2.lib")     //      
pthread_t t1;           //pthread_t  t1,      1 ID
pthread_t t2;           //pthread_t  t2,      2 ID
pthread_rwlock_t rwlock;             //     
int data=1;                          //    
void* readerM(void* arg)
{
	while(1)
	{
	pthread_rwlock_rdlock(&rwlock);    //     
	printf("M     : %d 
",data); // pthread_rwlock_unlock(&rwlock); // Sleep(1200); } return NULL; } void* readerN(void* arg) { while(1) { pthread_rwlock_rdlock(&rwlock); printf(" N : %d
",data); pthread_rwlock_unlock(&rwlock); Sleep(700); } return NULL; } void* writerA(void* arg) { while(1) { pthread_rwlock_wrlock(&rwlock); // data++; // printf(" A : %d
",data); pthread_rwlock_unlock(&rwlock); // Sleep(2000); } return NULL; } void* writerB(void* arg) { while(1) { pthread_rwlock_wrlock(&rwlock); data++; printf(" B : %d
",data); pthread_rwlock_unlock(&rwlock); Sleep(2000); } return NULL; } void main(int argc,char** argv) { pthread_rwlock_init(&rwlock, NULL); // pthread_create(&t1,NULL,readerM,NULL); pthread_create(&t1,NULL,readerN,NULL); pthread_create(&t2,NULL,writerA,NULL); pthread_create(&t2,NULL,writerB,NULL); pthread_rwlock_destroy(&rwlock); // Sleep(10000000); return; }