読み書きロックの使用(マルチスレッドプログラミングガイド)
5847 ワード
読み書きロックのプロパティを設定すると、読み書きロックが初期化されます.次の関数は、読み書きロックを初期化または破棄したり、読み書きロックをロックまたは解除したり、読み書きロックをロックしようとしたりするために使用します.次の表に、このセクションで説明した読み書きロックを処理するための関数を示します.
表4-9読み書きロック処理ルーチン 読み取り非ブロック読み書きロックのロック
非ブロック読み書きロックに書き込まれるロック
リードライトロックの初期化
rwlockが参照する読み書きロックをattrで参照する属性で初期化できます.
attrがNULLの場合、デフォルトの読み書きロック属性オブジェクトを渡すアドレスと同じ役割を果たすデフォルトの読み書きロック属性が使用されます.読み書きロックを初期化すると、再初期化することなく任意の回数を使用できます.初期化に成功すると、読み書きロックの状態は初期化された状態とロックされていない状態になります.pthread_を呼び出すとrwlock_Init()は、初期化された読み書きロックを指定しますが、結果は不確定です.読み書きロックが使用される前に初期化されていない場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
デフォルトの読み書きロック属性が適用される場合、PTHREAD_RWLOCK_INITIALIZERマクロは、pthread_を呼び出すことによって作用する静的に割り当てられた読み書きロックを初期化することができる.rwlock_init()パラメータattrをNULLとして指定して動的初期化を行うのは、エラーチェックが実行されない点と同じです.
成功したらpthread_rwlock_Init()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
pthread_rwlock_Init()に失敗すると、rwlockは初期化されず、rwlockの内容は不確定になります.
説明:
attrまたはrwlockで指定した値は無効です.
リード・ライト・ロックのリード・ロックの取得
rwlockが参照する読み書きロックに読み書きロックを適用するために使用することができる.
ライタがリードロックを所有しておらず、ライタがロックに基づいてブロックされていない場合、呼び出しスレッドはリードロックを取得します.ライタがリードロックを持っていないが、複数のライタがロックを待っている場合、呼び出しスレッドがロックを取得できるかどうかは不明です.ライタがリードロックを持っている場合、呼び出しスレッドはロックを取得できません.呼び出しスレッドがリードロックを取得していない場合は、ブロックされます.呼び出しスレッドは、pthread_からロックを取得する必要があります.rwlock_rdlock()が返されます.呼び出し時に呼び出しスレッドがrwlockの書き込みロックを持っている場合、結果は不確定です.
ライタリソースの不足を回避するために、複数のインプリメンテーションにおいて、ライタの優先度をリーダよりも高くすることができる.たとえば、Solarisスレッドインプリメンテーションでは、リーダよりもライタの優先度が高くなります.「」を参照してください.
1つのスレッドはrwlockに複数の同時リードロックを保持することができ、pthread_を正常に呼び出すことができる.rwlock_rdlock()n回.スレッドはpthread_を呼び出す必要がありますrwlock_unlock()は、一致するロック解除操作をn回実行できます.
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_rdlock()では、結果は不確定です.
スレッド信号処理プログラムは、読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドは、スレッドが中断されていないかのように、読み書きロックを待って読み取りを実行し続けます.
成功したらpthread_rwlock_rdlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
attrまたはrwlockで指定した値は無効です.
読み取り非ブロック読み書きロックのロック
リードロックの適用方法とpthread_rwlock_rdlock()と同様に、任意のスレッドがrwlockのライトロックまたはライタがrwlockに基づいてブロックされている場合、pthread_rwlock_tryrdlock()関数は失敗します.Solarisスレッドの場合は、を参照してください.
rwlockが参照する読み書きロックオブジェクトで読み取りを実行するためのロックが取得された場合、pthread_rwlock_tryrdlock()はゼロを返します.ロックが取得されていない場合は、エラーを示すエラー番号が返されます.
説明:
ライタがロックを保持しているか、ロックに基づいてブロックされているため、読み取りと書き込みのロックを取得できません.
リード・ライト・ロックのロックへの書き込み
rwlockが参照する読み書きロックに書き込みロックを適用するために使用することができる.
他のリーダスレッドまたはライタスレッドが読み書きロックrwlockを持っていない場合、呼び出しスレッドは書き込みロックを取得します.そうでない場合、呼び出しスレッドはブロックされます.呼び出しスレッドは、pthread_からロックを取得する必要があります.rwlock_wrlock()呼び出しが返されます.呼び出し時に呼び出しスレッドが読み書きロック(リードロックまたはライトロック)を持っている場合、結果は不確定です.
ライタリソースの不足を回避するために、複数のインプリメンテーションにおいて、ライタの優先度をリーダよりも高くすることができる.(たとえば、Solarisスレッド実装では、リーダよりもライタの優先度が高くなります.を参照してください.)
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_wrlock()では、結果は不確定です.
スレッド信号処理プログラムは、書き込みを実行するために読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドはスレッドが中断していないかのように、読み書きロックを待機し続け、書き込みを実行します.
rwlockが参照する読み書きロックオブジェクトで書き込みを実行するためのロックが取得された場合、pthread_rwlock_rwlock()はゼロを返します.ロックが取得されていない場合は、エラーを示すエラー番号が返されます.
非ブロック読み書きロックに書き込まれるロック
書き込みロックの適用方法とpthread_rwlock_wrlock()と同様に、任意のスレッドが現在、読み取りおよび書き込みのためのrwlockを持っている場合、pthread_rwlock_trywrlock()関数は失敗します.Solarisスレッドの場合は、を参照してください.
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_trywrlock()では、結果は不確定です.
スレッド信号処理プログラムは、書き込みを実行するために読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドはスレッドが中断していないかのように、読み書きロックを待機し続け、書き込みを実行します.
rwlock参照の読み書きロックオブジェクトで書き込みを実行するためのロックが取得された場合、pthread_rwlock_trywrlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
読み取りロックまたは書き込みロックがロックされているため、書き込みに対して読み取りロックと書き込みロックを取得できません.
読み書きロックのロック解除
rwlock参照の読み書きロックオブジェクトに保持されているロックを解放するために使用できます.
呼び出しスレッドが読み書きロックrwlockを持っていない場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
pthread_を呼び出すとrwlock_unlock()は、読み書きロックオブジェクトのリードロックを解放し、他のリードロックが現在ロックオブジェクトによって保持されている場合、オブジェクトはリードロック状態を維持します.pthread_rwlock_unlock()は、リード・ライト・ロック・オブジェクト内の呼び出しスレッドの最後のリード・ロックを解放し、呼び出しスレッドはオブジェクトの所有者ではありません.pthread_rwlock_unlock()は、読み書きロックオブジェクトの最後の読み書きロックを解放すると、読み書きロックオブジェクトは所有者なしでロック解除状態になります.
pthread_を呼び出すとrwlock_unlock()は、読み書きロックオブジェクトの最後の書き込みロックを解放すると、読み書きロックオブジェクトは所有者なしでロック解除状態になります.
pthread_rwlock_unlock()は、読み書きロックオブジェクトのロックを解除し、複数のスレッドがそのオブジェクトを取得して書き込みを実行するのを待っている場合、スケジューリングポリシーによって、そのオブジェクトを取得して書き込みを実行するスレッドを決定することができる.複数のスレッドがリード・ライト・ロック・オブジェクトを取得してリードを実行するのを待っている場合、スケジューリング・ポリシーによって、ライトを実行するために待機スレッドが取得される順序が決定されます.複数のスレッドがrwlockのリードロックとライトロックに基づいてブロックされている場合、リーダとライタが先にロックを取得した人を特定できません.
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_unlock()では、結果は不確定です.
成功したらpthread_rwlock_unlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
読み書きロックの破棄
rwlock参照の読み書きロックオブジェクトを破棄し、ロックで使用されているリソースを解放するために使用できます.
pthread_を再呼び出しrwlock_Init()ロックを再初期化する前に、ロックを使用することによる影響は不確定です.実装はpthread_を引き起こす可能性がありますrwlock_destroy()はrwlockが参照するオブジェクトを無効な値に設定します.任意のスレッドがrwlockを持っている場合にpthread_を呼び出すrwlock_destroy()では、結果は不確定です.初期化されていない読み書きロックを破棄しようとすると、不確定な動作が発生します.破棄された読み書きロックオブジェクトはpthread_を使用できます.rwlock_Init()を使用して再初期化します.読み書きロックオブジェクトを破棄した後、他の方法で参照した場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
成功したらpthread_rwlock_destroy()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
attrまたはrwlockで指定した値は無効です.
表4-9読み書きロック処理ルーチン 読み取り非ブロック読み書きロックのロック
非ブロック読み書きロックに書き込まれるロック
リードライトロックの初期化
rwlockが参照する読み書きロックをattrで参照する属性で初期化できます.
include int pthread_rwlock_init(pthread_rwlock_t
rwlock, const pthread_rwlockattr_t
attr); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
attrがNULLの場合、デフォルトの読み書きロック属性オブジェクトを渡すアドレスと同じ役割を果たすデフォルトの読み書きロック属性が使用されます.読み書きロックを初期化すると、再初期化することなく任意の回数を使用できます.初期化に成功すると、読み書きロックの状態は初期化された状態とロックされていない状態になります.pthread_を呼び出すとrwlock_Init()は、初期化された読み書きロックを指定しますが、結果は不確定です.読み書きロックが使用される前に初期化されていない場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
デフォルトの読み書きロック属性が適用される場合、PTHREAD_RWLOCK_INITIALIZERマクロは、pthread_を呼び出すことによって作用する静的に割り当てられた読み書きロックを初期化することができる.rwlock_init()パラメータattrをNULLとして指定して動的初期化を行うのは、エラーチェックが実行されない点と同じです.
成功したらpthread_rwlock_Init()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
pthread_rwlock_Init()に失敗すると、rwlockは初期化されず、rwlockの内容は不確定になります.
説明:
attrまたはrwlockで指定した値は無効です.
リード・ライト・ロックのリード・ロックの取得
rwlockが参照する読み書きロックに読み書きロックを適用するために使用することができる.
include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );
ライタがリードロックを所有しておらず、ライタがロックに基づいてブロックされていない場合、呼び出しスレッドはリードロックを取得します.ライタがリードロックを持っていないが、複数のライタがロックを待っている場合、呼び出しスレッドがロックを取得できるかどうかは不明です.ライタがリードロックを持っている場合、呼び出しスレッドはロックを取得できません.呼び出しスレッドがリードロックを取得していない場合は、ブロックされます.呼び出しスレッドは、pthread_からロックを取得する必要があります.rwlock_rdlock()が返されます.呼び出し時に呼び出しスレッドがrwlockの書き込みロックを持っている場合、結果は不確定です.
ライタリソースの不足を回避するために、複数のインプリメンテーションにおいて、ライタの優先度をリーダよりも高くすることができる.たとえば、Solarisスレッドインプリメンテーションでは、リーダよりもライタの優先度が高くなります.「」を参照してください.
1つのスレッドはrwlockに複数の同時リードロックを保持することができ、pthread_を正常に呼び出すことができる.rwlock_rdlock()n回.スレッドはpthread_を呼び出す必要がありますrwlock_unlock()は、一致するロック解除操作をn回実行できます.
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_rdlock()では、結果は不確定です.
スレッド信号処理プログラムは、読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドは、スレッドが中断されていないかのように、読み書きロックを待って読み取りを実行し続けます.
成功したらpthread_rwlock_rdlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
attrまたはrwlockで指定した値は無効です.
読み取り非ブロック読み書きロックのロック
リードロックの適用方法とpthread_rwlock_rdlock()と同様に、任意のスレッドがrwlockのライトロックまたはライタがrwlockに基づいてブロックされている場合、pthread_rwlock_tryrdlock()関数は失敗します.Solarisスレッドの場合は、を参照してください.
include int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
rwlockが参照する読み書きロックオブジェクトで読み取りを実行するためのロックが取得された場合、pthread_rwlock_tryrdlock()はゼロを返します.ロックが取得されていない場合は、エラーを示すエラー番号が返されます.
説明:
ライタがロックを保持しているか、ロックに基づいてブロックされているため、読み取りと書き込みのロックを取得できません.
リード・ライト・ロックのロックへの書き込み
rwlockが参照する読み書きロックに書き込みロックを適用するために使用することができる.
include int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock );
他のリーダスレッドまたはライタスレッドが読み書きロックrwlockを持っていない場合、呼び出しスレッドは書き込みロックを取得します.そうでない場合、呼び出しスレッドはブロックされます.呼び出しスレッドは、pthread_からロックを取得する必要があります.rwlock_wrlock()呼び出しが返されます.呼び出し時に呼び出しスレッドが読み書きロック(リードロックまたはライトロック)を持っている場合、結果は不確定です.
ライタリソースの不足を回避するために、複数のインプリメンテーションにおいて、ライタの優先度をリーダよりも高くすることができる.(たとえば、Solarisスレッド実装では、リーダよりもライタの優先度が高くなります.を参照してください.)
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_wrlock()では、結果は不確定です.
スレッド信号処理プログラムは、書き込みを実行するために読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドはスレッドが中断していないかのように、読み書きロックを待機し続け、書き込みを実行します.
rwlockが参照する読み書きロックオブジェクトで書き込みを実行するためのロックが取得された場合、pthread_rwlock_rwlock()はゼロを返します.ロックが取得されていない場合は、エラーを示すエラー番号が返されます.
非ブロック読み書きロックに書き込まれるロック
書き込みロックの適用方法とpthread_rwlock_wrlock()と同様に、任意のスレッドが現在、読み取りおよび書き込みのためのrwlockを持っている場合、pthread_rwlock_trywrlock()関数は失敗します.Solarisスレッドの場合は、を参照してください.
include int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_trywrlock()では、結果は不確定です.
スレッド信号処理プログラムは、書き込みを実行するために読み書きロックを待つスレッドに送信される信号を処理することができる.信号処理プログラムから戻ると、スレッドはスレッドが中断していないかのように、読み書きロックを待機し続け、書き込みを実行します.
rwlock参照の読み書きロックオブジェクトで書き込みを実行するためのロックが取得された場合、pthread_rwlock_trywrlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
読み取りロックまたは書き込みロックがロックされているため、書き込みに対して読み取りロックと書き込みロックを取得できません.
読み書きロックのロック解除
rwlock参照の読み書きロックオブジェクトに保持されているロックを解放するために使用できます.
include int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
呼び出しスレッドが読み書きロックrwlockを持っていない場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
pthread_を呼び出すとrwlock_unlock()は、読み書きロックオブジェクトのリードロックを解放し、他のリードロックが現在ロックオブジェクトによって保持されている場合、オブジェクトはリードロック状態を維持します.pthread_rwlock_unlock()は、リード・ライト・ロック・オブジェクト内の呼び出しスレッドの最後のリード・ロックを解放し、呼び出しスレッドはオブジェクトの所有者ではありません.pthread_rwlock_unlock()は、読み書きロックオブジェクトの最後の読み書きロックを解放すると、読み書きロックオブジェクトは所有者なしでロック解除状態になります.
pthread_を呼び出すとrwlock_unlock()は、読み書きロックオブジェクトの最後の書き込みロックを解放すると、読み書きロックオブジェクトは所有者なしでロック解除状態になります.
pthread_rwlock_unlock()は、読み書きロックオブジェクトのロックを解除し、複数のスレッドがそのオブジェクトを取得して書き込みを実行するのを待っている場合、スケジューリングポリシーによって、そのオブジェクトを取得して書き込みを実行するスレッドを決定することができる.複数のスレッドがリード・ライト・ロック・オブジェクトを取得してリードを実行するのを待っている場合、スケジューリング・ポリシーによって、ライトを実行するために待機スレッドが取得される順序が決定されます.複数のスレッドがrwlockのリードロックとライトロックに基づいてブロックされている場合、リーダとライタが先にロックを取得した人を特定できません.
初期化されていない読み書きロックに対してpthread_を呼び出すとrwlock_unlock()では、結果は不確定です.
成功したらpthread_rwlock_unlock()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
読み書きロックの破棄
rwlock参照の読み書きロックオブジェクトを破棄し、ロックで使用されているリソースを解放するために使用できます.
include int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
pthread_を再呼び出しrwlock_Init()ロックを再初期化する前に、ロックを使用することによる影響は不確定です.実装はpthread_を引き起こす可能性がありますrwlock_destroy()はrwlockが参照するオブジェクトを無効な値に設定します.任意のスレッドがrwlockを持っている場合にpthread_を呼び出すrwlock_destroy()では、結果は不確定です.初期化されていない読み書きロックを破棄しようとすると、不確定な動作が発生します.破棄された読み書きロックオブジェクトはpthread_を使用できます.rwlock_Init()を使用して再初期化します.読み書きロックオブジェクトを破棄した後、他の方法で参照した場合、結果は不確定です.Solarisスレッドの場合は、を参照してください.
成功したらpthread_rwlock_destroy()はゼロを返します.それ以外の場合、エラーを示すエラー番号が返されます.
説明:
attrまたはrwlockで指定した値は無効です.