linux-kernel - Linux Rcu到底有没有锁?
怪我咯
怪我咯 2017-04-17 14:54:23
[Linux讨论组]

3.14内核代码

rcu机制不是宣称无锁吗?
但是rcu_lock_acquire那句是个锁吗?怎么解释呢?求解惑
<include/linux/rcupdate.h>
806 static inline void rcu_read_lock(void)
807 {
808         __rcu_read_lock();
809         __acquire(RCU);
810         rcu_lock_acquire(&rcu_lock_map);
811         rcu_lockdep_assert(rcu_is_watching(),
812                            "rcu_read_lock() used illegally while idle");
813 }

同文件 line 313 rcu_lock_acquire 定义如下
313 #ifdef CONFIG_DEBUG_LOCK_ALLOC
314
315 static inline void rcu_lock_acquire(struct lockdep_map *map)
316 {
317 lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_);
318 }

lock_acquire的reference:
<kernel/locking/lockdep.h>
318 /*
319 * Acquire a lock.
320 *
321 * Values for "read":
322 *
323 * 0: exclusive (write) acquire
324 * 1: read-acquire (no recursion allowed)
325 * 2: read-acquire with same-instance recursion allowed
326 *
327 * Values for check:
328 *
329 * 0: disabled
330 * 1: simple checks (freeing, held-at-exit-time, etc.)
331 * 2: full validation
332 */
333 extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
334 int trylock, int read, int check,
335 struct lockdep_map *nest_lock, unsigned long ip);
336
337 extern void lock_release(struct lockdep_map *lock, int nested,
338 unsigned long ip);

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
ringa_lee

我没有细看过rcu的实现,不过从命名上来说 read-copy-update 这种机制读应当是不加锁的,参考 kernel.org 的 whatisRCU 这篇说明,rcu_read_lock 应该只是做了个标记,表示这块内存正在被另一个 reader 读取,即使另一个 writer 执行了 update ,在其他 reader 执行 unlock 之前也不应该被释放。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号