C++:如果通过 boost lockfree 队列,一个线程能否将新分配的对象视为未初始化?

C++: Can one thread see a newly allocated object as uninitialized if passed through boost lockfree queue?

我正在构建一个多生产者单一消费者机制。 我想做这样的事情,假设我可以访问一个可用于两个线程和同步条件变量的 boost 无锁队列实例:

线程 1(生产者):

Object * myObj = new Object();
lockfree_queue.push(myObj);
condition_variable.notify();

线程 2(消费者):

condition_variable.wait();
Object * myObj = lockfree_queue.pop();
...
delete myObj;

在多核系统上,线程 2 是否有可能将 myObj 视为指向未初始化的内存或部分初始化的对象(假设它有一些成员变量)?

一旦 new returns 给你一个指针,对象就完全构造好了。

如果对象中有未初始化的成员,那么是构造函数没有初始化它们的错误。

即使队列包含对象实例而不是指针也不应该成为问题,因为 push 调用将在您通知条件变量之前完全完成,因此其他线程甚至不会弹出队列直到对象被推送。