rcu_assign_pointer() 可以用在 rcu_read_lock() 和 rcu_read_unlock() 之间吗?
Can rcu_assign_pointer() be used between rcu_read_lock() and rcu_read_unlock()?
一开始,我有一个 CPU 核心作为写共享数据的写入器和一个 reader 核心来读取共享数据。
我需要 reader 写回一些数据以共享数据。
我知道 rcu_read_lock()
/rcu_read_unlock()
用于 reader 来获取共享数据。但是我不确定 reader 回写共享数据会导致什么问题?
在reader中:
rcu_read_lock();
//get shared data
//modify the data
rcu_assign_pointer(ptr1, ptr2)
rcu_read_unlock();
此代码有效吗?
RCU 的一个相当基本的 属性 是多个编写器之间的协调是通过另一种机制处理的,例如传统锁。 RCU 将保证 readers 看到一致的数据视图,并且他们正在使用的指针在完成之前不会被释放,但它不会对同时发生的不同线程的多个更新进行排序。
RCU 确实保证可以从 reader 升级到作家状态。这可以通过在意识到需要更新时获取自旋锁来完成。在调用 synchronize_rcu 之前必须退出 rcu_read_lock/rcu_read_unlock 块,但是 call_rcu 可以在块内排队回调。
不允许在 rcu_read_lock/rcu_read_unlock 块内进行阻塞,因此在此类内部使用阻塞互斥体管理编写器互斥将不起作用。
一开始,我有一个 CPU 核心作为写共享数据的写入器和一个 reader 核心来读取共享数据。
我需要 reader 写回一些数据以共享数据。
我知道 rcu_read_lock()
/rcu_read_unlock()
用于 reader 来获取共享数据。但是我不确定 reader 回写共享数据会导致什么问题?
在reader中:
rcu_read_lock();
//get shared data
//modify the data
rcu_assign_pointer(ptr1, ptr2)
rcu_read_unlock();
此代码有效吗?
RCU 的一个相当基本的 属性 是多个编写器之间的协调是通过另一种机制处理的,例如传统锁。 RCU 将保证 readers 看到一致的数据视图,并且他们正在使用的指针在完成之前不会被释放,但它不会对同时发生的不同线程的多个更新进行排序。
RCU 确实保证可以从 reader 升级到作家状态。这可以通过在意识到需要更新时获取自旋锁来完成。在调用 synchronize_rcu 之前必须退出 rcu_read_lock/rcu_read_unlock 块,但是 call_rcu 可以在块内排队回调。
不允许在 rcu_read_lock/rcu_read_unlock 块内进行阻塞,因此在此类内部使用阻塞互斥体管理编写器互斥将不起作用。