我有一个高度多线程的程序,它包含一个侵入式对象链接列表。我需要将该列表中的对象传递给多个线程,但是一次只能有1个线程拥有该对象,这意味着我不需要共享该对象或指向它的指针。
我想使用boost使用unique_ptr创建一个侵入式列表,但是从我的读物来看,unique_ptr与Boost侵入式库不兼容,因为它没有正确的所有权语义。
对于this,侵入式库要求其元素(指针)具有与原始指针相同的所有权语义。因此unique_ptr甚至shared_ptr将不符合条件。
我想知道是否有人可以给我一些有关如何最好地实现入侵列表的建议,以便我可以安全地通过多个线程传递其元素,并知道它们正在移动到该线程中而不在线程之间共享?
最佳答案
据我所知,要使其正常工作,您将需要某种auto-unlink hooks。
由于侵入式容器不拥有其包含的对象,因此将您的unique_ptrs引用的原始指针添加到侵入式容器中应该没有任何问题。
如果您需要能够从侵入列表中的原始指针访问实际的unique_ptr,那么enable_shared_from_this可能会有所帮助。 (您需要将侵入式容器与侵入式unique_ptr结合使用。)
经过一番思考后,似乎实际上并没有侵入式unique_ptr变体,因为智能指针的“侵入式”部分通常用于引用计数,而像unique_ptr这样的对象没有引用计数。
可能最好是使用shared_ptr,因为它已经具有enabled_shared_from_this。