2

以下の読み取り/書き込みロックの実装を 1 つ取得しました。関数の最初にpthread_mutex_lock呼び出しがあることに注意してください。とにかく一度使用する場合pthread_mutex_lock、読み取り/書き込みロックを使用する利点は何ですか。単に使用するよりも優れている点はpthread_mutex_lock何ですか?

int pthread_rwlock_rlock_np(pthread_rwlock_t *rwlock)
{
    pthread_mutex_lock(&(rwlock->mutex));
    rwlock->r_waiting++;
    while (rwlock->r_wait > 0)
    {
        pthread_cond_wait(&(rwlock->r_ok), &(rwlock->mutex));
    }
    rwlock->reading++;
    rwlock->r_waiting--;
    pthread_mutex_unlock(&(rwlock->mutex));
    return 0;
}

int pthread_rwlock_wlock_np(pthread_rwlock_t *rwlock)
{
    pthread_mutex_lock(&(rwlock->mutex));
    if(pthread_mutex_trylock(&(rwlock->w_lock)) == 0)
    {
        rwlock->r_wait = 1;
        rwlock->w_waiting++;
        while (rwlock->reading > 0)
        {
            pthread_cond_wait(&(rwlock->w_ok), &(rwlock->mutex));
        }
        rwlock->w_waiting--;
        pthread_mutex_unlock(&(rwlock->mutex));
        return 0;
    }
    else
    {
        rwlock->wu_waiting++;
        while (pthread_mutex_trylock(&(rwlock->w_lock)) != 0)
        {
            pthread_cond_wait(&(rwlock->w_unlock), &(rwlock->mutex));
        }
        rwlock->wu_waiting--;
        rwlock->r_wait = 1;
        rwlock->w_waiting++;
        while (rwlock->reading > 0)
        {
            pthread_cond_wait(&(rwlock->w_ok), &(rwlock->mutex));
        }
        rwlock->w_waiting--;
        pthread_mutex_unlock(&(rwlock->mutex));
        return 0;
    }
}
4

4 に答える 4

4

rwlock->mutexミューテックスは、ターゲット プログラムでリーダー/ライター ロックが保護している状態ではなく、構造自体の状態を保護するために使用されrwlockます。このミューテックスは、ロックが取得または解放されている間だけ保持されます。リーダー/ライター ロック自体の「簿記」に必要な状態が損なわれるのを避けるために、短時間だけ入力されます。対照的に、リーダー/ライター ロックは、ロックが保護する構造に対して実際の読み取りと書き込みを実行する呼び出し元によって、長期間保持される場合があります。

于 2012-06-22T13:08:03.787 に答える
2

どちらの関数でも、rwlock->mutex戻る前に解放されます。つまり、rwlock をリーダーまたはライターとして保持しているからといって、mutex を保持しているわけではありません。

rwlock のポイントの半分は、複数のリーダーが同時に操作できることです。これは、単にミューテックスを使用するよりも直接的な利点です。これらのリーダーは、リーダー ロックを取得するためにミューテックスを短時間だけ保持します。実際の作業を行っている間はミューテックスを保持しません。

于 2012-06-22T13:07:59.820 に答える
0

一度に複数の読み取りまたは単一の書き込みが可能になります。これは、一度に 1 つの読み取りまたは 1 つの書き込み操作よりも優れています。

于 2012-06-22T13:07:54.017 に答える
0

単純に pthread_mutex_lock を使用するよりも優れている点は何ですか?

  1. この実装でも、リーダーはクリティカル セクションで同時に実行されます。
  2. 「高速パス」でアトミックを使用する、より優れた (移植性の低い) 実装が存在する可能性があります (待機中はロックが必要です)。
于 2012-06-22T13:10:10.990 に答える