Коррупция
Независимо от системы [параллельной или истинно параллельной] состояние памяти зависит от реализации устройства памяти. Вообще говоря, чтение и запись в память не являются атомарными, что означает, что возможно, что несколько одновременных обращений к одному и тому же адресу памяти могут привести к противоречивым результатам [т.е. повреждение данных].
Представьте два одновременных запроса: 1 запись и 1 чтение простого целочисленного значения. Допустим, целое число составляет 4 байта. Скажем также, что для чтения требуется 2 нс, а для записи требуется 4 нс
- t0 , Начальное значение базового 4-байтового кортежа, [0, 0, 0, 0]
- t1 , начинается запись операции, запись первого байта [255, 0, 0, 0]
- t2 , запись операции продолжается, запись второго байта [255, 255, 0, 0]
- t2 , начинается чтение операции, чтение первых 2 байтов [255, 255, -, -]
- t3 , запись операции продолжается, запись третьего байта [255, 255, 255, 0]
- t3 , чтение операций заканчивается, чтение последних 2 байтов [255, 255, 255, 0]
- t4 , запись операций заканчивается, запись четвертого байта [255, 255, 255, 255]
Значение, возвращаемое чтением, не является ни оригинальным, ни новым значением. Значение полностью повреждено.
И что это значит для вас!
Правда, это невероятно упрощенный и надуманный пример, но какой возможный эффект это может иметь в вашем сценарии? На мой взгляд, наиболее уязвимым элементом вашей системы диагностики является список диагностических данных.
Если ваш список имеет фиксированный размер, скажем, массив ссылок на объекты, в лучшем случае вы можете потерять целые объекты, так как элементы массива перезаписываются конкурирующими потоками, в худшем случае вы обнаружите ошибку, если элемент содержит поврежденную ссылку на объект [a Сценарий коррупции выше].
Если ваш список динамический, то возможно, что основная структура данных повреждена [если массив, как в .Net List<>
, когда он перераспределяется, или если связанный список ваших следующих \ prev ссылок теряется или поврежден ].
В сторону
Почему доступ к памяти не является атомарным? По той же причине реализации базового набора не являются атомарными - это было бы слишком ограничительно и приводило бы к накладным расходам, эффективно наказывая за простые сценарии. Поэтому потребителю [нам!] Предоставляется возможность синхронизировать наши обращения к памяти.