Элемент массива скалярных типов является объектом скалярного типа. Поток, считывающий элементы 0 и 1, не имеет проблемы параллелизма с элементом 2 записи потока, даже если он использует одну машинную инструкцию. Элементы чтения потоков 0 и 1 имеют проблему с элементом записи потоков 1, даже если используются отдельные инструкции, если мьютекс отсутствует. Конечно, элементы чтения кода 0 и 1 не могут использовать одну инструкцию, которая читает, например, 4 элемента, а затем отбрасывают лишние данные, потому что это действительно может привести к плохому чтению из-за записи другого потока в той части, которая будет отброшена.
тим, у меня есть структура:
struct Foo {
char a; // read and written to by thread 1 only
char b; // read and written to by thread 2 only
};
Из того, что я понимаю, стандарт C ++ гарантирует безопасность вышеизложенного, когда два потока работают в двух разных местах памяти.
Я думаю, однако, что поскольку char a и char b попадают в одну и ту же строку кэша, компилятор должен выполнить дополнительную синхронизацию.
Что именно здесь происходит?