RCU全称Read Copy Update,这是一种对读写锁的优化。当所有对相关数据结构的操作时读者行为时,则通过最高层次的禁止线程调度就可以了,如果需要对这个队列进行写操作,那么可以先将原来的数值复制一份出来,然后对复制出来的数据进行处理,最后在适当的时机进行更新。而更新的适当时机则是所有的处理器上都进行了一次线程切换之后,因为只有这样才能保证整个所有的处理器上的读者都释放了相应的资源。
struct foo {
int a;
char b;
long c;
};
DEFINE_SPINLOCK(foo_mutex);
struct foo *gbl_foo;
void foo_update_a(int new_a)
{
struct foo *new_fp;
struct foo *old_fp;
new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL);
spin_lock(&foo_mutex);
old_fp = gbl_foo;
*new_fp = *old_fp;
new_fp->a = new_a;
rcu_assign_pointer(gbl_foo, new_fp);
spin_unlock(&foo_mutex);
synchronize_rcu();
kfree(old_fp);
}
int foo_get_a(void)
{
int retval;
rcu_read_lock();
retval = rcu_dereference(gbl_foo)->a;
rcu_read_unlock();
return retval;
}