我有一个消费者 - 生产者的情况,我不断将数据推送到列表中,如果它不存在,那么我每隔几秒就打包并将数据发送到服务器。
目前我有一个延迟了几秒钟的线程,唤醒,设置一个标志,以便没有任何内容添加到列表中,打包,删除从列表中处理的项目,然后允许程序启动再次添加到列表中。
对于原型来说这很好,但现在我需要让它在更现实的情况下更好地工作。
所以,我想让生产者获取信息,当大小足够大或足够的时间过去时,将列表传递给要处理的线程。
我想将引用传递给列表,而unique_ptr将是有益的,因此一旦移动它,生产者线程就可以创建一个新列表,并且出于所有实际目的,使用与之前相同的列表。
但是当我试图从
更改我的列表时typedef list<string> STRINGQUEUE;
STRINGQUEUE newMachineQueue;
到
std::unique_ptr<STRINGQUEUE> newMachineQueue;
然后我收到insert
不是std::unique_ptr
成员的错误。
我认为我不想使用newMachineQueue.get()
然后执行我的操作,因为我认为我失去了unique_ptr
的好处。
那么,如何在列表中使用unique_ptr并能够调用列表中的方法?
答案 0 :(得分:2)
就像使用指针一样使用它。
newMachineQueue->insert(...);
您可能会对in the documentation感兴趣。
您也不需要使用unique_ptr
,但您可以移动列表并重新分配新列表。
void consumer(std::list<string> list) {
// accept by value!
}
std::list<string> machineQueue;
// hand-off to consumer
consumer(std::move(machineQueue));
machineQueue = std::list<string>{}; // new list