記事ディレクトリ
1. 読み書きロックの原理
読み取り/書き込みロック (読み取り/書き込みロック) は、マルチスレッド環境で共有リソースの読み取りと書き込みを行うための特別なロック メカニズムです。ミューテックスとは異なり、読み取り/書き込みロックでは、複数のスレッドが共有リソースを同時に読み取ることができますが、書き込みできるのは 1 つのスレッドのみです。読み取り/書き込みロックは同時実行パフォーマンスを向上させることができ、読み取り操作が書き込み操作よりも頻繁に行われるシナリオに適しています。
2. 提供する操作機能
Linux システム プログラミングでは、読み取り/書き込みロックの関連機能も pthread ライブラリを通じて提供されます。一般的に使用される読み取り/書き込みロック関連の関数は次のとおりです。
pthread_rwlock_init
この関数の役割は、読み取り/書き込みロックを初期化することです。- プロトタイプ:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
- パラメータ:
rwlock
: 初期化する読み取り/書き込みロック変数へのポインタ。attr
: 読み取り/書き込みロック属性へのポインタ。通常は に設定されますNULL
。
- 戻り値: 成功した場合は 0 を返し、失敗した場合はエラー コードを返します。
- プロトタイプ:
pthread_rwlock_destroy
この関数の機能は、読み取り/書き込みロックを破棄することです。- プロトタイプ:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
- パラメータ:
rwlock
: 破棄する読み取り/書き込みロック変数へのポインタ。
- 戻り値: 成功した場合は 0 を返し、失敗した場合はエラー コードを返します。
- プロトタイプ:
pthread_rwlock_rdlock
この関数の役割は、読み取りロックを取得することです。- プロトタイプ:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
- パラメータ:
rwlock
: 読み取りロックを取得するための読み取り/書き込みロック変数へのポインタ。
- 戻り値: 成功した場合は 0 を返し、失敗した場合はエラー コードを返します。
- プロトタイプ:
pthread_rwlock_wrlock
この関数の役割は、書き込みロックを取得することです。- プロトタイプ:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
- パラメータ:
rwlock
: 書き込みロックを取得するための読み取り/書き込みロック変数へのポインタ。
- 戻り値: 成功した場合は 0 を返し、失敗した場合はエラー コードを返します。
- プロトタイプ:
pthread_rwlock_unlock
この関数の役割は、読み取りロックまたは書き込みロックを解除することです。- プロトタイプ:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
- パラメータ:
rwlock
: 解放する読み取り/書き込みロック変数へのポインタ。
- 戻り値: 成功した場合は 0 を返し、失敗した場合はエラー コードを返します。
- プロトタイプ:
サンプルコード
#include <stdio.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int shared_data = 0;
void* reader_func(void* arg) {
pthread_rwlock_rdlock(&rwlock);
printf("Reader %ld read shared data: %d\n", (long)arg, shared_data);
pthread_rwlock_unlock(&rwlock);
return NULL;
}
void* writer_func(void* arg) {
pthread_rwlock_wrlock(&rwlock);
shared_data += 1;
printf("Writer %ld wrote shared data: %d\n", (long)arg, shared_data);
pthread_rwlock_unlock(&rwlock);
return NULL;
}
int main() {
pthread_rwlock_init(&rwlock, NULL);
pthread_t reader_thread1, reader_thread2, writer_thread;
pthread_create(&reader_thread1, NULL, reader_func, (void*)1);
pthread_create(&reader_thread2, NULL, reader_func, (void*)2);
pthread_create(&writer_thread, NULL, writer_func, (void*)1);
pthread_join(reader_thread1, NULL);
pthread_join(reader_thread2, NULL);
pthread_join(writer_thread, NULL);
pthread_rwlock_destroy(&rwlock);
return 0;
}
4. 事例説明
上記のコードでは、pthread_rwlock_init
関数を使用して読み取り/書き込みロックを初期化し、2 つの読み取りスレッドと 1 つの書き込みスレッドを作成します。読み取りスレッドはpthread_rwlock_rdlock
関数を通じて読み取りロックを取得し、書き込みスレッドは関数を通じて書き込みロックを取得しpthread_rwlock_wrlock
、対応する読み取りおよび書き込み操作を実行します。最後に、pthread_rwlock_unlock
関数を通じてロックが解放され、pthread_rwlock_destroy
関数を通じて読み取り/書き込みロックが破棄されます。