gpt4 book ai didi

c++ - 在 C++11 中的线程之间高效安全地传递不可变对象(immutable对象)

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:46 25 4
gpt4 key购买 nike

假设 Producer Thread 创建一个任意类型 O 的对象 o 然后必须读取(并且只读取)通过 Consumer Thread,这是在 C++11 中以高效且线程安全的方式实现此目的的理想方式?

到目前为止,我的实现依赖于生产者-消费者模型,使用基于模板的互斥/条件工作队列:

template<typename T> class WorkQueue {
std::list<T> queue;
std::mutex mut;
std::condition_variable cond;

public:
...
}

如果o的类型定义如下:

class WorkItem {
const int value;
public:
WorkItem(int v) : value(v) {}

const int getValue() {
return value;
}
}

线程像这样在堆中生产和使用 WorkItem 对象:

WorkQueue<WorkItem*> workQueue;
...

void producerThread() {
workQueue.add(new WorkItem(0));
}

void consumerThread() {
WorkItem *item = workQueue.remove();
doSomething(item.getValue());
delete item;
}

我能保证消费者可以正确读取堆对象吗?

如果答案恰好是否定的,我猜测 WorkItem 的成员应该受到互斥体的保护,但这将是一个非常低效的解决方案,因为在 WorkItem 可供所有线程。或者,我猜测在这种情况下基于原子化的方法可能会更好。

最佳答案

您的建议看起来不错。您可以存储像 std::unique_ptr<WorkItem> 这样的智能指针获得异常安全性,例如doSomething()抛出。你应该知道无锁队列,但你不一定需要使用它,特别是如果它意味着向你的项目添加新的库依赖项。最后,所有new内存分配有一天可能会成为瓶颈,在这种情况下,请考虑使用对象池或以其他方式重用您的 WorkItems。但其中大部分现在都是不成熟的优化。

关于c++ - 在 C++11 中的线程之间高效安全地传递不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454886/

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