Проблема со списком мне не до конца ясна. Обычно в многопоточном программировании заморачиваются порядком в котором write из одного потока становятся видны в другом потоке. Те вы допустим инициализируете объект и потом добавляете его в список - в слабых моделях можно оказаться в ситуации где указатель на объект станет видим до того как другой поток (сидящий на другом ядре) увидит записи инициализации полей объекта - но синхронизация встроенными примитивами это предотвращает. На Интеле такой проблемы нет (если только компилятор не переупорядочит, сам процессор такого не делает).