Потоки и строковые литералы - PullRequest
0 голосов
/ 02 марта 2012

Допустимо ли (определенное поведение) доступ к строковому литералу одновременно с несколькими потоками? Учитывая функцию как это:

const char* give()
{
  return "Hello, World!";
}

Можно ли сохранить вызов функции и разыменование указателя одновременно?

Редактировать: много ответов. Примет первый, кто может показать мне раздел из стандарта.

Ответы [ 6 ]

4 голосов
/ 02 марта 2012

В соответствии со стандартом:

C ++ 11 1.10 / 3: значение объекта, видимого для потока T в определенной точке, является начальным значением объекта, значением, назначеннымобъекту по T или значению, назначенному объекту другим потоком, в соответствии с правилами ниже.

Строковый литерал, как и любой другой константный объект, не может быть назначен юридически;он имеет статическую продолжительность хранения и поэтому инициализируется до запуска программы;следовательно, все потоки будут видеть его начальное значение всегда.

Старые стандарты ничего не говорили о потоках;поэтому, если ваш компилятор не поддерживает модель потоков C ++ 11, вам придется обратиться к его документации для каких-либо гарантий безопасности потоков.Однако трудно представить какую-либо реализацию, в которой доступ к неизменным объектам не был потокобезопасным.

3 голосов
/ 02 марта 2012

Да, это безопасно.Почему бы не быть?Было бы небезопасно, если бы вы попытались изменить строку, но это все равно незаконно.

2 голосов
/ 02 марта 2012

Всегда безопасно получить доступ к неизменным данным из нескольких потоков.Строковые литералы являются примером неизменяемых данных (так как их изменение запрещено во время выполнения), поэтому доступ к ним из нескольких потоков безопасен.

1 голос
/ 02 марта 2012

Пока вы только читаете данные, вы можете получать к ним доступ из любого количества потоков. Когда необходимо изменить данные, это становится сложным.

0 голосов
/ 02 марта 2012

Строковые литералы (концептуально) хранятся в постоянной памяти и инициализируются при загрузке (а не во время выполнения).Поэтому безопасно получать к ним доступ из нескольких потоков в любое время.

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

Но строковые литералы полностью безопасны.

0 голосов
/ 02 марта 2012

Это зависит от реализации компилятора Си. Но я не знаю реализации, где одновременный доступ к чтению может быть небезопасным, поэтому на практике это безопасно.

...