, поэтому у меня есть булевский тип в C++ на многопроцессорной машине. Переменная начинается с жизни как истина, а затем есть несколько потоков, любая из которых может записать ее как ложную.Нужно ли защищать эту переменную блокировкой?
В то же время эти потоки также могут читать эту переменную, чтобы проверить ее состояние. Мне все равно, если чтение этой переменной синхронизируется с любой из записей, каждый из них происходит в разных местах кода, и не имеет значения, идет ли оно до или после какой-либо конкретной записи. Теперь мне нужна блокировка для этого булева?
Единственный способ, которым мне нужен замок, - если на очень низком уровне память может быть повреждена двумя конкурирующими записями. Если, например, инструкция сборки на процессоре A записывает 0 в байт, который представляет логическое значение, в то время как процессор B делает то же самое ... и вместо того, чтобы записать 0, память заканчивается значением 22 или что нибудь. Это может что-то испортить.
Итак, в общем случае, если proc A записывает 3 в ячейку памяти, в то время как proc B записывает 7 без синхронизации, я гарантированно получаю хотя бы 3 или 7? Или это легко сломать память?
Редактировать:
Спасибо за комментарии ребята. Дополнительная информация: в программе, конечно, есть синхронизация. Подводя итог, соответствующий флаг говорит о том, что определенный пул памяти «грязный» (необходимо уплотнять). Любой поток может, следовательно, принять решение об установке этого флага в значение false (это означает, что пул грязный). Например, освобождение памяти из пула делает ее грязной. Любой поток также может считывать этот флаг и устанавливать другой флаг, чтобы сигнализировать о необходимости очистки - эта проверка выполняется, когда память распределяется из пула, очистка сигнализируется, если у нас мало памяти. Где-то в моем главном критическом разделе между итерациями, где каждый поток идет искать больше данных для обработки, у меня будут потоки, проверяющие этот второй флаг, и сделайте что-то подходящее, чтобы убедиться, что: все остальные адды заканчивают свою текущую итерацию, один поток очищает память, устанавливает первый флаг в true (как в пуле не загрязнен), устанавливает второй флаг обратно в false и затем снова освобождает все потоки.
Поэтому я не думаю, что мне нужен замок, потому что: блокировка гарантирует, что запись не произойдет одновременно с другой записью или чтением. Но кто заботится, пока аппаратное обеспечение не подводит меня, худший сценарий - это то, что чтение происходит случайным образом до или после записи - это то же самое, что и в случае, если я защищу его блокировкой, как раз тогда мы бы действительно уверен, что он пришел до или после ...
Я думаю, что тот же аргумент применим ко второму знаку, упомянутому выше.
Из интереса, почему вы не заботитесь о чтении? Предположим, что какой-то поток написал false - тогда, если вам все равно, читает ли результат в 'true' или' false', зачем читать чтение? Это просто, что «неправильные» «истинные» чтения безвредны? –