У меня есть два потока, которые разделяют большой массив данных. Один поток пишет в него, а другой читает из него. Поскольку при чтении массив не может находиться в состоянии «не полностью обновленного», я перехватываю все операции с массивами (чтение / запись).
Я также пытаюсь «хорошо поиграть с кешем» - когда я читаю / пишу большие объемы данных, я получаю один мьютекс и читаю / пишу столько, сколько требуется в последовательности, затем освобождаю мьютекс sh.
[править: чтобы уточнить, это это поведение кеша я бы хотел сохранить. если вы читаете / записываете большой объем памяти в последовательности , то кэш может извлекать большие строки данных из памяти (медленно!) только один раз , а затем работать с кэшем (быстро) !) без повторного нажатия на память до тех пор, пока эта строка кэша не будет исчерпана.]
Одна вещь, от которой я хотел бы защитить, - это «запись в небольшую часть массива в одном потоке, а затем в другом потоке (после получения мьютекс) чтение из той небольшой части массива , которая еще не была сброшена в память (из кэша первого потока / ядра), что приводит к устаревшему чтению ". Таким образом, решение будет заключаться в том, чтобы пометить массив как «volatile» (верно?).
Правильно ли я беспокоиться, что «пометка массива как volatile» будет полностью уничтожить мою способность читать / записывать большие чанки в соответствии с корректным кэшем? Или каждое чтение / запись будет вызываться в / из памяти?
В идеальном мире я думаю, что мне хотелось бы иметь возможность: 1. захватить мьютекс, 2. загрузка данных из памяти (как если бы она была энергозависимой), 3. чтение / запись в массив (как если бы она не энергозависимая - следует безопасно полагаться на собственный кэш b c мьютекс), 4. (в случае записи) flu sh любой оставшийся кеш в памяти. 5. relinqui sh mutex
Могу ли я выполнить sh это? Есть ли здесь какие-то явные недоразумения с моей стороны?