我有一个类,基本上是一个队列,用于在2个线程之间传输动态分配的对象。第一个线程创建这些对象,第二个线程消耗它们。我使用“std::unique_ptr”将对象的所有权从线程1传递到线程2。
实际上,调用将对象放入队列的方法如下:
问题在于
实际上,调用将对象放入队列的方法如下:
queue.put(std::move(unique_ptr_to_my_object));
以及签名:
bool Queue::put(std::unique_ptr<T> p);
问题在于
put()
方法必须检查某些条件来决定是否可以将对象添加到队列中。如果条件为false,则该方法仅返回false以指示无法将对象添加到队列中,但是对象已被销毁,因为所有权已由put()
获取。
所以我想知道是否可以像这样重写put()
,或者是否有更好的解决方案:bool Queue::put(std::unique_ptr<T> &ref) {
if(CANNOT_ADD)
return false; // ownership remains in the calling function
std::unique_ptr<T> p = std::move(ref); // we know we can add so take ownership
/* ... */
}
Queue::put(std::unique_ptr<T>&& ref)
。 - NathanOliverunique_ptr
,并且不太关心它是否被移动到队列中,为什么我需要先将其变成lvalue。 - NathanOliverput
失败会丢失对象,我想建议的用法是那种你应该关心它是否移动到队列中 - 如果失败了,你必须做其他事情。不过我同意,如果只有有时候关心对象,那么你的方法是有道理的。 - Martin Bonner supports MonicatryPut
重命名,以便一眼就能看出它可能会失败。 - Peter Ruderman