Я написал базовый планировщик графиков c, который синхронизирует выполнение задачи без ожидания. Поскольку топология графа неизменна, я решил, что все операции Atom c будут упрощены. Однако, когда я узнал больше об аппаратном обеспечении ЦП, я начал беспокоиться о поведении моей структуры данных на платформах с более слабыми моделями памяти (я только протестировал свой код на x86). Вот сценарий, который беспокоит меня:
Поток 1 (T1) и Поток 2 (T2) одновременно обновляют (неатомно) области памяти X и Y соответственно, а затем переходят к выполнению других не связанных задач.
Поток 3 (T3) выбирает зависимую задачу после выполнения T1 и T2, загружает X и Y и суммирует их. Синхронизация получения / выпуска, соединения потоков или блокировки не выполняются, и задача T3 гарантированно будет запланирована после выполнения T1 и T2.
Предполагая, что T1, T2 и T3 запланированы (ОС) на разных ядрах ЦП, мой вопрос: При отсутствии каких-либо ограничений памяти или инструкций, подобных блокировке, T3 гарантированно см. последние значения X и Y? Другой способ задать вопрос: Если вы не вставите ограждение, через какое время после магазина вы сможете выполнить загрузку, или нет никаких гарантий относительно этого?
Меня беспокоит то, что нет никаких гарантий, что ядра, которые выполнили T1 и T2, очистили свои буферы хранения к тому времени, когда ядро T3 попытается загрузить эту информацию . Я склонен думать о гонках данных как о повреждениях данных, которые происходят из-за нагрузки и хранилища (или хранилища и хранилища), происходящего одновременно. Однако я пришел к выводу, что не совсем уверен, что в действительности означает , учитывая распределенную природу процессоров в микромасштабе. Согласно CppRef:
Программа, которая имеет две конфликтующие оценки, имеет гонку данных, если:
- обе оценки не выполняются в одном потоке или в одном и том же обработчике сигналов, или
- обе конфликтующие оценки являются атомом c операциями (см. Std :: atomi c) или
- одна из конфликтующих оценок происходит раньше другой (см. Std :: memory_order)
Похоже, это означает, что любой, использующий мой планировщик графиков, столкнется с гонкой данных (при условии, что они сами не защищают от нее), даже если я могу гарантировать, что T3 не будет работать до T1 и Т2 сделаны. Я еще не наблюдал гонки данных в моих тестах, но я не настолько наивен, чтобы думать, что одних тестов достаточно, чтобы доказать это.