Я создаю механизм с несколькими потребителями для одного производителя.
Я хочу сделать что-то вроде этого, предположим, у меня есть доступ к экземпляру очереди без блокировки, доступной для обоих потоков и переменной условия синхронизации:
Тема 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
возвращает и дает вам указатель, объект полностью построен.
Если в объекте есть неинициализированные элементы, то виноват конструктор в том, что они не инициализированы.
И это не должно быть проблемой, даже если очередь содержала экземпляры объектов вместо указателей, как push
вызов будет полностью выполнен до того, как вы уведомите переменную условия, поэтому другой поток даже не вытолкнет очередь, пока объект не будет нажат.