読み書きロックのpthread_rwlock

1.読み書きロックとは何ですか

   多くの場合、次のような特徴の共有変数へのアクセスがあります。ほとんどの場合、スレッドは単に共有変数の値を読み取るには、ごく少数の例を変更していません

スレッドは、真に共有変数の値を変更します。この場合、要求は同期の間で読みする必要はありません、それらの間の同時アクセスは安全です。しかし

あなたは、相互に排他的な書き込み要求することや、他の要求を読み取る必要があります。
  この状況は、このような設定項目として、実際には存在しています。ほとんどの時間は、設定の変更は、状況が時折設定が表示されます修正起こるだろうされていません。もし

使用ミューテックス、完全に防止同時読み取り要求は、パフォーマンスの低下になります。この考察では、POSIXは、読み書きロックを導入しました。

 

II。ロック書き込みAPI

  1.書き込みロック属性

    書き込みロック属性(pthread_rwlockattr_t)2を持っていますlockkindとのpshared。

    lockkind(1) 読み取り優先(デフォルトプロパティ)、書き込み優先順位を含む読み出しと書き込みの戦略、。

    優先順位を読む:後続の要求が書き込みロック要求がブロックされていないロック要求を読み取るために書き込みロックで来る場合。限り、安定したストリームの到着を戦った読み取りロック要求する場合があります

        読み取りロックを完了しなかった、書き込みにはポイントをロックしません。このポリシーは、以前につながる書き込みロック飢餓

    書き込み優先順位:書き込み要求がロックを取得することはできません前に、スレッドのアプリケーションの書き込みロックすると、書き込みロック要求裏すぐに読んでロック要求はすべて、ブロックされます。

列挙
{ 
PTHREAD_RWLOCK_PREFER_READER_NP、//読者プライオリティ(デフォルトプロパティ)
PTHREAD_RWLOCK_PREFER_WRITER_NP、//読者優先
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP、//ライト好ましい
PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP //読者優先度を
}。
/ *取得および設定のプロパティ* /
int型のpthread_rwlockattr_getkind_np(定数pthread_rwlockattr_t * attrの、int型*県)。
int型pthread_rwlockattr_setkind_np(pthread_rwlockattr_t * ATTR、INT *県)。

 

     (2)のpshared 

    PTHREAD_PROCESS_PRIVATE:競争の過程で読み書きロック - デフォルトプロパティ

    PTHREAD_PROCESS_PUBLIC:読み書きプロセスのロックとの競合 

//属性セットのpshared 
pthread_rwlockattr_setpshared int型(pthread_rwlockattr_t * attrの、int型のpshared); 
//プロパティを取得のpshared 
pthread_rwlockattr_getpshared int型(pthread_rwlockattr_t * attrの、int型 *のpshared);

 

  1.の作成

int型pthread_rwlock_initの(pthread_rwlock_t *は、rwlock、constのpthread_rwlockattr_t * ATTR); 

pthread_rwlock_tは、rwlock = PTHREAD_RWLOCK_INITIALIZER

  入手2.

int型pthread_rwlock_rdlockの(pthread_rwlock_t * rwptr)//读锁
int型は、pthread_rwlock_wrlock(pthread_rwlock_t * rwptr)//写锁

  3.リリース

int型pthread_rwlock_unlockの(pthread_rwlock_t * rwptr)//読み取りまたは書き込みロックロック解除

  4.破壊

int型pthread_rwlock_destroyの(pthread_rwlock_t *は、rwlock);

 

III。原則読み書きロック

変数  説明
__ロック 管理読み書きロックは、ロックを解除するために読み取りまたは書き込みロックされているかどうか、グローバルな競争をロックし、相互に排他的になります
__writer 書き込みロックホルダスレッドID、0は現在の無線チェンが書き込みロックを保持していることを示している場合
__nr_reads スレッドが保持している読み込みロックの数
__nr_reads_queued スレッドを待っている当事者の数はロックを読みます
__nr_writers_queued キューに入れられた書き込みロックスレッドの数

  アプリケーションは、読み取りロックまたは書き込みロックまたはロック解除を適用するかどうかは、ロックとアンロックの(__lockに相当)少なくとも一つのグローバルミューテックスを持っている、閉塞考慮せずに、ただ考えます

オーバーヘッド動作自体は、ロックおよびロック解除読み書きロックのオーバヘッドは倍ミューテックスです。もちろん、機能や障害物に入る前の終了前に、それはグローバルミューテックスのリリースとなります。

場合リードロック要求について1.:

    (I)無線チェンが書き込みロックを保持している、すなわち== 0 __writer

    (II)は(== 0 __nr_writers_queued)リーダ最初の戦略又は全くライトロックウェイターに使用されている

  場合2つの条件が満たされた場合、読み取りロック要求がロックが__nr_readersを実行するために返す前に、すぐに使用できます読ん++、スレッド読み取りロックを所有しているの増加を表しています。

  満たされていない、実行は、その後、障害物の中に、そのfutexを呼び出し、読み取りロックウェイターの増加を表す++ __nr_readers_queued。私は目が覚めたとき、それが実行さ

__nr_readers_queued-、その後は満たす条件1及び2か否かを再度判断する

:場合、ライトロック要求2.が、

    無線経路が書き込みロックを有している(I)、即ち== 0 __writer

    (II)は、ロック糸を保持していません__nr_readersは== 0という

  長い上記の条件が満たされているとしてとして、それはすぐに、__writerセットIDスレッド(スケジューリングドメインを)書き込みロックを取得します

  ない場合、実行は++ __nr_writers_queued、それはその後、上昇書き込みロックウェイタースレッドを表し待ちに実行ミューテックス。目を覚ます、実行

__nr_writers_queued-、再度判定条件1と2。

:現在のロックが書き込みロックである場合、次のないロック解除するための3、

    = 0行う__writerは、書き込みロック解除表す

    書き込みロックウェイターは、ウェイクアップがあった場合、__nr_writers_queued決定したか否かライトロックウェイターを記載し

 ている場合何の書き込みロックのウェイターありません、何の読み取りロックウェイターがないと判断され、もしそうなら、それはロックウェイターを読んで一斉に目を覚ますだろう。

 :現在のロックが読み取りロックがある場合は、次の操作を行い

    、読み取りロック乗員を示す少なく、実行__nr_readers-を

    ウェイクアップする必要性を待って、それは彼が読み取りロックの最後の乗員だったと言われ、0に等しい裁判官の__nr_readersを書き込みロックをまたはロックウェイターを読ん人:

    に従って書き込みロックウェイターがあるかどうかを判断し、もしそうであれば、書き込みロックを待機しているスレッドを覚ます__nr_writers_queued
    読み取りロックウェイターがあるかどうかを決定するための書き込みロックウェイターあれば、そうであれば、すべての目を覚ましますロックウェイターを読みます

おすすめ

転載: www.cnblogs.com/blackandwhite/p/12447522.html