当前位置: 首页 > 知识库问答 >
问题:

如何在tbb::concurrent_unordered_map中使用弱_ptr?

芮明知
2023-03-14

我正在使用tbb::concurrent_unordered_map在我的程序中替换std::map,如下所示:

Before:

class KvSubTable;
typedef std::weak_ptr<KvSubTable> KvSubTableId;
std::map<KvSubTableId, int, std::owner_less<KvSubTableId> > mEntryMap;

现在,我使用tbb::concurrent_unordered_map替换std::map,但是它有一些编译错误:

tbb::concurrent_unordered_map<KvSubTableId, int, tbb::tbb_hash<KvSubTableId>, std::owner_less<KvSubTableId> > mEntryMap;

CPP/ext/amd64/include/TBB/internal/_ TBB _ hash _ compare _ impl . h:66:37:错误:从类型“const std::weak_ptr”到类型“std::size_t”的static_cast无效< br> {aka long unsigned int}'
返回static _ cast(t)* internal::hash _ multiplier;

我已经尝试了一些这样解决方案,但是不起作用:

template <typename T>
inline bool operator==(const std::weak_ptr<T>& t, const std::weak_ptr<T>& u)
{
    return !t.owner_before(u) && !u.owner_before(t);
}

那么,它怎么能工作,请帮助....

共有1个答案

简嘉赐
2023-03-14

您需要为 std::weak_ptr 定义一个哈希函数。您可以在 TBB 库的测试中找到该示例。

 类似资料:
  • 是否有人有任何使用TBB有效并行std::分区的技巧?这已经完成了吗? 以下是我的想法: 如果数组很小,std::将其分区(串行)并返回 否则,使用自定义迭代器将数组视为2个交错数组(在缓存大小的块中交错) 为每对迭代器启动一个并行分区任务(递归到步骤1) 在两个分区/中间指针之间交换元素* 返回合并的分区/中间指针 *我希望在一般情况下,与数组的长度相比,或者与将数组划分为连续块时所需的交换相比

  • 问题内容: 我想在Swift中存储一系列弱引用。数组本身不应该是一个弱引用-它的元素应该是。我认为可可对此提供了非类型安全的版本。 问题答案: 创建通用包装,如下所示: 将此类的实例添加到您的数组。 定义时,可以使用或。 另外,为了帮助获取数组内容,您可以按照以下方式进行操作: 上面的用法应替换为-但我不认为当前的Swift语言允许这样定义扩展。

  • 在多核的平台上开发并行化的程序,必须合理地利用系统的资源 - 如与内核数目相匹配的线程,内存的合理访问次序,最大化重用缓存。有时候用户使用(系统)低级的应用接口创建、管理线程,很难保证是否程序处于最佳状态。 Intel Thread Building Blocks (TBB) 很好地解决了上述问题: TBB提供C++模版库,用户不必关注线程,而专注任务本身。 抽象层仅需很少的接口代码,性能上毫不逊

  • 问题内容: 除非a 声明为,否则引用似乎在Swift中不起作用,我不希望在纯Swift应用程序中使用它。 这段代码给出了一个编译错误(不能应用于非类类型): 我需要给协议加上前缀,然后它才能工作。 问题:什么是完成Swift的“纯” Swift方法 ? 问题答案: 您需要将协议类型声明为。 用你的话说,只有类才能符合此协议,而结构或枚举则不能。

  • 引用在Swift中似乎不起作用,除非声明为(我不希望在纯Swift应用程序中这样做)。 我需要为协议添加前缀,这样它就可以工作了。 问题:实现的“纯”快速方法是什么?

  • 问题内容: 我有一个Swift类,需要存储自己的方法表。不幸的是,这导致了一个引用周期,因为它的表通过其存储的方法保留了对它的引用。 以下示例泄漏代码: 到目前为止,我发现的唯一解决方案是改为执行此操作: 这很丑陋,而且容易出错。还有更好的主意吗?是否有一些使函数引用本身变弱的技巧?即使类型的数组或什么?据我所知,我什至无法在上述丑陋的封闭包装上构建作为语法糖的便捷功能。 问题答案: 您当然可以为