可以在rcu_read_lock和rcu_read_unlock之间使用rcu_assign_pointer吗?

时间:2017-10-01 05:59:17

标签: c linux rcu

一开始,我有一个cpu核心作为写入共享数据的编写器,一个核心作为读取器读取共享数据。
但现在,我需要读者回写一些数据来共享数据 我知道rcu_read_lock和rcu_read_unlock用于读取器获取共享数据。但是我不确定读者回写共享数据会导致任何问题吗?

 In reader:

 rcu_read_lock();
    get share data
    modify the data 

    rcu_assign_pointer("the share data will be write back")
 rcu_read_unlock();

此代码有效吗?

1 个答案:

答案 0 :(得分:1)

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

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

不允许在rcu_read_lock / rcu_read_unlock块内部阻止,因此使用阻塞互斥锁管理编写器互斥将不起作用。

请参阅kernel.org RCU read-to-write upgrade