リーダー・ライターロックとの比較
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/01/13 15:24 UTC 版)
「リード・コピー・アップデート」の記事における「リーダー・ライターロックとの比較」の解説
RCUはいろいろな使い方があるが、一般的な使い方はリーダー・ライターロックに近い。以下のふたつのコードはリーダー・ライターロック(左側)とRCU(右側)を同じ処理で使ったものである。 1 struct el { 1 struct el { 2 struct list_head lp; 2 struct list_head lp; 3 long key; 3 long key; 4 spinlock_t mutex; 4 spinlock_t mutex; 5 int data; 5 int data; 6 /* Other data fields */ 6 /* Other data fields */ 7 }; 7 }; 8 DEFINE_RWLOCK(listmutex); 8 DEFINE_SPINLOCK(listmutex); 9 LIST_HEAD(head); 9 LIST_HEAD(head); 1 int search(long key, int *result) 1 int search(long key, int *result) 2 { 2 { 3 struct el *p; 3 struct el *p; 4 4 5 read_lock(&listmutex); 5 rcu_read_lock(); 6 list_for_each_entry(p, &head, lp) { 6 list_for_each_entry_rcu(p, &head, lp) { 7 if (p->key == key) { 7 if (p->key == key) { 8 *result = p->data; 8 *result = p->data; 9 read_unlock(&listmutex); 9 rcu_read_unlock();10 return 1; 10 return 1;11 } 11 }12 } 12 }13 read_unlock(&listmutex); 13 rcu_read_unlock();14 return 0; 14 return 0;15 } 15 } 1 int delete(long key) 1 int delete(long key) 2 { 2 { 3 struct el *p; 3 struct el *p; 4 4 5 write_lock(&listmutex); 5 spin_lock(&listmutex); 6 list_for_each_entry(p, &head, lp) { 6 list_for_each_entry(p, &head, lp) { 7 if (p->key == key) { 7 if (p->key == key) { 8 list_del(&p->lp); 8 list_del_rcu(&p->lp); 9 write_unlock(&listmutex); 9 spin_unlock(&listmutex); 10 synchronize_rcu();10 kfree(p); 11 kfree(p);11 return 1; 12 return 1;12 } 13 }13 } 14 }14 write_unlock(&listmutex); 15 spin_unlock(&listmutex);15 return 0; 16 return 0;16 } 17 } 両者の違いは非常に小さい。参照側のロックは rcu_read_lock() と rcu_read_unlock() になり、更新側のロックはリーダー・ライターロックから単純なスピンロックに変更され、kfree()を実行するまえに synchronize_rcu() が呼び出される。 しかし、この場合参照側と更新側が同時に動作する可能性が出てくる。多くの場合はこれは問題とはならないが、使われ方を十分注意する必要がある。たとえば、複数の独立したリストをアトミックに更新しなければならない場合、これをRCUに置き換えるには注意が必要である。 synchronize_rcu() があるということはRCUでは delete() がブロックされる可能性があることを示す。それが問題となる場合は代わりに call_rcu() を call_rcu (kfree, p) のように使用すればよい。これは参照カウントと組合わせる場合に特に便利である。
※この「リーダー・ライターロックとの比較」の解説は、「リード・コピー・アップデート」の解説の一部です。
「リーダー・ライターロックとの比較」を含む「リード・コピー・アップデート」の記事については、「リード・コピー・アップデート」の概要を参照ください。
- リーダー・ライターロックとの比較のページへのリンク