Мьютексы гарантированно достаточны.Какая бы магия не была необходима, чтобы она работала, они содержат.До тех пор, пока каждый поток, который получает доступ или изменяет какой-либо конкретный экземпляр s
, делает это под защитой одного и того же мьютекса , проблем не будет.
Единственная разница между доступом и назначениемэто - вам не нужен мьютекс, чтобы два потока не могли одновременно читать одни и те же данные.Мьютекс требуется только в том случае, если объект может быть изменен в одном потоке, когда другой поток осуществляет или может получить к нему доступ.Допускается одновременное чтение.
Обратите внимание, что это обычное правило и применяется к типичным объектам, таким как std::string
.Можно, если хотите, создать объект, который будет работать без прерывания даже при одновременном чтении, и даже когда один объект читается в одном потоке, а другой объект того же типа читается в другом потоке.(Но такие объекты бесполезны, и люди просто не должны их делать.)