Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:如果通过boost无锁队列,一个线程是否可以将新分配的对象视为未初始化的对象?_C++_Multithreading_Lock Free_Condition Variable_Happens Before - Fatal编程技术网

C++ C++;:如果通过boost无锁队列,一个线程是否可以将新分配的对象视为未初始化的对象?

C++ C++;:如果通过boost无锁队列,一个线程是否可以将新分配的对象视为未初始化的对象?,c++,multithreading,lock-free,condition-variable,happens-before,C++,Multithreading,Lock Free,Condition Variable,Happens Before,我正在建立一个多生产者单消费者机制。 我想这样做,假设我可以访问boost lockfree queue的一个实例,该实例可用于两个线程和一个同步条件变量: 线程1(生产者): 线程2(耗电元件): 在多核系统上,线程2是否有可能将myObj视为指向未初始化的内存或部分初始化的对象(假设它有一些成员变量)?一旦new返回并给您一个指针,对象就完全构造好了 如果对象中有未初始化的成员,则是构造函数没有初始化它们的错误 即使队列包含对象实例而不是指针,这也不应该是一个问题,因为在通知条件变量之前,p

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

线程1(生产者):

线程2(耗电元件):


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

一旦
new
返回并给您一个指针,对象就完全构造好了

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


即使队列包含对象实例而不是指针,这也不应该是一个问题,因为在通知条件变量之前,
push
调用将完全完成,所以在对象被推之前,另一个线程甚至不会弹出队列。

这是因为无锁队列.push()类似于Atomic.store吗(xxx,MexyYyOrthyRelax)和LoopFrixQueal.Popy.(to)Acto.Load(MexyYyOrthyLoad)?@ KikoSa不,这是因为C++是(在没有循环的情况下)严格按顺序进行,并且您有适当的同步。在第一个线程中,对象的分配和构造总是在您将其推送到队列之前发生,而推送到队列总是在您调用
condition\u variable.notify()之前发生(并且完全完成)
。第二个线程将等待条件变量,直到第一个线程发送通知后才会继续。什么是“严格顺序”mean?@curiousguy语句在没有循环或
goto
的情况下,从上到下、从左到右依次执行。@JoachimPileborg运算符操作数的计算顺序(除了
&&
|
?:
)未指定。ctor中成员init列表元素的计算顺序是声明顺序。Cv与无锁无关。您需要了解这些工具和概念。
Object * myObj = new Object();
lockfree_queue.push(myObj);
condition_variable.notify();
condition_variable.wait();
Object * myObj = lockfree_queue.pop();
...
delete myObj;