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
调用将在您通知条件变量之前完全完成,因此其他线程甚至不会弹出队列直到对象被推送。
我正在构建一个多生产者单一消费者机制。 我想做这样的事情,假设我可以访问一个可用于两个线程和同步条件变量的 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
调用将在您通知条件变量之前完全完成,因此其他线程甚至不会弹出队列直到对象被推送。