C ++ 11 Потоковая безопасность с переменными стека - PullRequest
2 голосов
/ 03 января 2012

Я немного запутался с новым потоком в C ++ 11.Я понимаю, как использовать мьютексы, чтобы два потока не могли одновременно работать с одними и теми же данными, но как насчет назначения этих данных?

Пример!

class Foo
{
    std::string s;

    // This would be called on a seperate thread
    void Bar() { s = std::string( "blah blah blah" ); }
};

Так что же яя спрашиваю, потому что я присваиваю что-то s, всегда ли переменная-член s остается в одной и той же ячейке памяти, а присваивания просто меняют внутренние данные, и в этом случае мне просто нужен мьютекс?Или я все еще могу попасть в ситуации с кэшированными значениями и другими вещами, которые означают, что мне нужно начать использовать atomic <>, чтобы убедиться, что у меня есть последние данные?Или это только для типов, таких как целые или структуры?

1 Ответ

4 голосов
/ 03 января 2012

Мьютексы гарантированно достаточны.Какая бы магия не была необходима, чтобы она работала, они содержат.До тех пор, пока каждый поток, который получает доступ или изменяет какой-либо конкретный экземпляр s, делает это под защитой одного и того же мьютекса , проблем не будет.

Единственная разница между доступом и назначениемэто - вам не нужен мьютекс, чтобы два потока не могли одновременно читать одни и те же данные.Мьютекс требуется только в том случае, если объект может быть изменен в одном потоке, когда другой поток осуществляет или может получить к нему доступ.Допускается одновременное чтение.

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

...