gpt4 book ai didi

c++ - 在线程之间按值传递对象

转载 作者:行者123 更新时间:2023-11-27 22:48:04 28 4
gpt4 key购买 nike

我正在尝试在具有队列的线程之间按值传递对象。

因为有多个不同的对象,所以我做了一个抽象类。

class message
{
public :
virtual ~message(){};
};

然后我为每种不同类型的消息创建一个子类

class a_specific_message : public message
{
...
};

我读了this tutorial用于实现队列,我按以下方式调用它:

concurrent_queue<message> queue;
a_specific_message m{1, 2, 3};
queue.push(m);

我的问题是我需要覆盖 operator= 以便队列可以克隆消息

popped_value=the_queue.front();

我尝试添加一个虚拟运算符,但它没有在子类中被调用。

我不知道如何在不通过引用传递对象的情况下实现这样的目标。

最佳答案

在我看来,多态性并不是你真正想要的。只有析构函数和动态向下转换的接口(interface)通常意味着您使用了错误的工具。


但是,如果多态是你想要的,让我提出std::unique_ptr .你可以在这里拥有像这样声明的指针队列:concurrent_queue<std::unique_ptr<message>>

正如您在评论中所说:

I didn't want to use pointers because devs will have to remember to delete it in another thread. It could be easy to forget and have a memory leak.

然后我想std::unqiue_ptr对你来说是正确的。

如果我翻译你的代码,它看起来像这样:

concurrent_queue<std::unique_ptr<message>> queue;
auto m = std::make_unique<a_specific_message>(1, 2, 3);

queue.push(std::move(m));

或者简单地说:

concurrent_queue<std::unique_ptr<message>> queue;

queue.push(std::make_unique<a_specific_message>(1, 2, 3));
// Or
queue.push(new a_specific_message{1, 2, 3});

然后,弹出值:

auto popped_value = std::move(the_queue.front());

然后所有内容都会自动删除,无需记住删除任何指针。 std::unique_ptr已为此目的创建。

为了避免代码中的显式移动,您可以使用类似 pop_value 的内容在你的队列中,像这样实现:

T pop_value() {
auto value = std::move(the_queue.front());

the_queue.pop();

// use nrvo
return value;
}

现在,在您的线程中,您可以安全地执行此操作:

{
auto some_message = queue.pop_value();

// stuff

} // some_message deleted here.

关于c++ - 在线程之间按值传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41024940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com