0

一开始,我有一个 CPU 内核作为写入器来写入共享数据,一个内核作为读取器来读取共享数据。
我需要读者写回一些数据来共享数据。
我知道rcu_read_lock()/rcu_read_unlock()用于读者获取共享数据。但是我不确定读者写回共享数据会不会造成什么问题?

在阅读器中:

 rcu_read_lock();
 //get shared data
 //modify the data 
 rcu_assign_pointer(ptr1, ptr2)
 rcu_read_unlock();

此代码有效吗?

4

1 回答 1

2

RCU 的一个相当基本的特性是多个编写者之间的协调是通过另一种机制来处理的,例如传统的锁。RCU 将保证读者看到一致的数据视图,并且他们正在使用的指针在完成之前不会被释放,但它不会对同时发生的来自不同线程的多个更新进行排序。

RCU 确实保证可以从读取器状态升级到写入器状态。这可以通过在意识到需要更新时获取自旋锁来完成。在调用 synchronize_rcu 之前必须退出 rcu_read_lock/rcu_read_unlock 块,但 call_rcu 可能会在块内排队回调。

不允许在 rcu_read_lock/rcu_read_unlock 块内进行阻塞,因此在使用阻塞互斥锁之类的内部管理写入器互斥将不起作用。

参见kernel.org RCU 读写升级

于 2017-10-01T07:21:28.280 回答