gpt4 book ai didi

c - 内核 read_lock 后跟 write_lock 提供软锁定

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:04 34 4
gpt4 key购买 nike

为了优化从哈希表中清除项目,我使用了 read_lock 和 write_lock :

DEFINE_RWLOCK(ht_rwlock);

void Clear(void (*deleter)(const void*))
{
int i;
struct hash_table* temp_node;

read_lock(&ht_rwlock);
hash_for_each(spu_hash_table, i, temp_node, next)
{
write_lock(&ht_rwlock);
hash_del(&temp_node->next);
write_unlock(&ht_rwlock);

deleter((const void*)temp_node);
}
read_unlock(&ht_rwlock);
}

但是这给了我一个错误:内核:错误:软锁定 - CPU#0 卡住了 22 秒! [rmmod:6724]

带有 write_lock/write_unlock 的非优化版本只能正常工作:

void Clear(void (*deleter)(const void*))
{
int i;
struct hash_table* temp_node;

write_lock(&ht_rwlock);
hash_for_each(spu_hash_table, i, temp_node, next)
{
hash_del(&temp_node->next);
deleter((const void*)temp_node);
}
write_unlock(&ht_rwlock);
}

我的问题是我真的必须使用写锁来遍历哈希表吗?

最佳答案

My question is do I really have to use write lock to iterate over hash table?

是的。内核中的RWlock不支持从读锁到写锁的转换。

原因很简单:有两个进程,每个进程都在读取部分,并且想推进它写入一个,导致死锁。

但您的情况是纯粹的修改(您从列表中删除所有元素),因此使用 read_lock 并将其转换为写锁在任何情况下都不会提高性能。使用 write_lock,就像在您的第二个代码中一样。


如果您关心性能,请考虑使用 RCU 锁 - 它允许读取器和写入器并发操作,因此根本不需要 rwlock,同步写入器的简单 lock足够了。但 RCU 的应用取决于上下文。

关于c - 内核 read_lock 后跟 write_lock 提供软锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675715/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com