безопасность std :: string, const и thread - PullRequest
0 голосов
/ 27 сентября 2018

Этот вопрос обсуждался, но я еще не видел четкого ответа.Это частично обсуждается здесь:

https://www.justsoftwaresolutions.co.uk/cplusplus/const-and-thread-safety.html

Но ответ все еще не совсем ясен со мной.

Если вы определите, std::string const kstrValue = "Value" - это kstrValue по своей сути нить-safe?

Что мое исследование показало, что оно поточно-ориентированное, если вы не вызываете функции библиотеки std, которые изменяют строку.

Это правда?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы не можете вызывать любые функции, которые изменяют эту строку, std :: или иным образом.В статье говорится, что ваши классы пишутся как std::string (или гипотетический int класс).

Убедившись, что методы, которые не не изменяют класс, помечены const, вы можете иметь const Foo объекты, свободно разделяемые между потоками, безопасные, зная, что не может бытьгонки данных, потому что не имеет модификаций .

Это немного более тонко с const Foo & ссылками.Вы не знаете, является ли базовый объект действительно const, или что const был добавлен к ссылке, и где-то еще могут произойти модификации.Доступ к таким объектам все еще должен быть синхронизирован между потоками.

0 голосов
/ 27 сентября 2018

Да, это так.

[res.on.data.races] / 3 :

Функция стандартной библиотеки C ++ не должна напрямую иликосвенно изменять объекты ([intro.multithread]), доступные для потоков, отличных от текущего потока, если к объектам не осуществляется прямой или косвенный доступ через неконстантные аргументы функции, включая this.

...