【问题标题】:An intrusive list of unique_ptrs?unique_ptrs 的侵入性列表?
【发布时间】:2011-04-22 06:27:07
【问题描述】:

我有一个高度多线程的程序,它包含一个侵入性的对象链接列表。我需要将此列表中的对象传递给多个线程,但一次只有 1 个线程拥有该对象,这意味着我不需要共享此对象或指向它的指针。

我想使用 boost 创建一个带有 unique_ptr 的侵入式列表,但据我所知,unique_ptr 与 Boost 侵入式库不兼容,因为它没有正确的所有权语义。

根据this,侵入式库要求其元素(指针)具有与原始指针相同的所有权语义。所以 unique_ptr 甚至 shared_ptr 都不符合条件。

我想知道是否有人可以就如何最好地实现我的侵入式列表给我一些建议,以便我可以安全地通过多个线程传递它的元素并知道它们正在被移动到该线程而不是在线程之间共享?

【问题讨论】:

  • 我不明白为什么指向您的对象的 指针 仅从一个线程引用对您很重要。 (无论如何它们都不是,因为它们至少是从侵入式容器每个智能指针引用的。)
  • 我只是认为从线程安全的角度来看会更好,因为如果只有1个线程有引用,就不会有线程安全问题。看来我显然没有考虑列表本身...

标签: c++ pointers ownership intrusive-containers


【解决方案1】:

据我所知,要使其正常工作,您将需要某种 auto-unlink hooks

由于侵入式容器拥有它所包含的对象,因此将 unique_ptrs 引用的原始指针添加到侵入式容器应该没有任何问题。

如果您需要能够从侵入式列表中的原始指针访问实际的 unique_ptr,enable_shared_from_this 可能会有所帮助。 (您需要将侵入式容器与侵​​入式 unique_ptr 结合起来。)


经过一番思考,似乎真的没有侵入性的 unique_ptr 变体,因为智能指针的“侵入性”部分通常用于引用计数,而类似 unique_ptr 的对象没有引用计数.

可能你最好使用 shared_ptr,因为它已经启用了_shared_from_this。

【讨论】:

  • 这听起来很有趣。所以我会把原始指针放在我的容器中,当我需要使用它们时,我会使用一种 enable_shared_from_this 构造将它们转换回 unique_ptr...你能详细说明一下你的想法吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-13
  • 2022-06-16
  • 1970-01-01
  • 2020-04-18
  • 2018-10-30
  • 1970-01-01
  • 2023-03-09
  • 2023-04-06
相关资源
最近更新 更多