c++并发编程实战中文版(第二版)201页的threadsafe_lookup_table代码疑似有误

博客指出《C++并发编程实战》中文版(第二版)第201页的threadsafe_lookup_table代码存在一个问题,导致编译报错。错误源于在const成员函数中,调用了返回const_iterator的begin()和end(),但后续操作需要读写迭代器。通过分析源码,博主揭示了解决方案,即定义新的只读迭代器类型,并为find_entry_for添加非const重载版本,同时调整接口函数中迭代器的使用,从而避免从const_iterator到iterator的非法转换。
摘要由CSDN通过智能技术生成

照着抄会直接报错, 后来我排查了很久才发现问题所在


问题排查

报错原因是这样的(手动分行)

No viable conversion from returned value of type
'std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::pair<int, std::basic_string<char>>>>>'
to function return type 'typename list<bucket_value>::iterator'
(aka '_List_iterator<_List_val<std::_List_simple_types<std::pair<int, std::basic_string<char>>>>>')

把第二行和第四行的类型提取出来, 可以看到大概意思应该是说不能把const的迭代器转为非const的迭代器

'std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::pair<int, std::basic_string<char>>>>>'
________________'_List_iterator<_List_val<std::_List_simple_types<std::pair<int, std::basic_string<char>>>>>'

 


首先, 查看list的源码可以看到list::begi

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中的lookup_one_len函数位于文件系统层中,定义在文件./fs/namei.c中。它的作用是根据指定的名称和长度,计算出哈希值,并在哈希表中查找该哈希值对应的dentry节点,如果找到则返回该dentry节点的指针,否则返回NULL。 函数原型如下: ``` struct dentry *lookup_one_len(const char *name, struct dentry *base, int len); ``` 其中,name参数是要查找的名称,base参数是查找的起始dentry节点,len参数是名称的长度。 该函数主要有以下几个步骤: 1. 计算哈希值 通过调用函数hashlen_string(name, len)计算出给定名称的哈希值。 2. 在哈希表中查找dentry节点 通过调用函数__lookup_hash()在哈希表中查找指定哈希值对应的dentry节点。如果找到,则返回该dentry节点的指针。 3. 如果在哈希表中未找到,则创建一个新的dentry节点 如果在哈希表中未找到指定哈希值对应的dentry节点,则调用函数d_alloc_name()创建一个新的dentry节点,并将其插入到哈希表中。 4. 返回dentry节点指针 如果在哈希表中找到了dentry节点,则直接返回该节点的指针;否则,返回新创建的dentry节点的指针。 完整的lookup_one_len()函数实现如下: ``` struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) { unsigned int hashval; struct qstr this; struct dentry *dentry; this.name = name; this.len = len; this.hash = 0; hashval = hashlen_string(name, len); spin_lock(&base->d_lock); dentry = __lookup_hash(&this, hashval, base); if (dentry) goto out; dentry = d_alloc_name(base, &this); if (IS_ERR(dentry)) goto out; __lookup_insert(dentry, hashval); out: spin_unlock(&base->d_lock); return dentry; } ``` 其中,hashlen_string()函数是用来计算指定名称的哈希值的。__lookup_hash()函数是用来在哈希表中查找dentry节点的。d_alloc_name()函数是用来创建新的dentry节点的。__lookup_insert()函数是用来将新创建的dentry节点插入到哈希表中的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值