многопоточность — C ++: может ли один поток видеть вновь выделенный объект как неинициализированный, если он проходит через очередь без блокировки lock?

Я создаю механизм с несколькими потребителями для одного производителя.
Я хочу сделать что-то вроде этого, предположим, у меня есть доступ к экземпляру очереди без блокировки, доступной для обоих потоков и переменной условия синхронизации:

Тема 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 указывает на неинициализированную память или на частично инициализированный объект (предположим, что он имеет некоторые переменные-члены)?

0

Решение

однажды new возвращает и дает вам указатель, объект полностью построен.

Если в объекте есть неинициализированные элементы, то виноват конструктор в том, что они не инициализированы.

И это не должно быть проблемой, даже если очередь содержала экземпляры объектов вместо указателей, как push вызов будет полностью выполнен до того, как вы уведомите переменную условия, поэтому другой поток даже не вытолкнет очередь, пока объект не будет нажат.

0

Другие решения


По вопросам рекламы [email protected]