Что именно означает статически выделенный в libc? По одному экземпляру библиотеки? Один на экземпляр программы?

В (g)libc, например, в функциях времени и даты, таких как localtime, в руководстве говорится:

Возвращаемое значение указывает на статически выделенную строку, которая может быть перезаписана последующими вызовами любой из функций даты и времени.

Насколько я знаю, моя программа однопоточная. Безопасно ли мне использовать функции «MT-Unsafe», такие как asctime или localtime?

Даже если в памяти всего 1 экземпляр библиотеки (g)libc? (Т.е. как динамическая библиотека.)

Означает ли "статический" "статический для моей программы" (для каждого экземпляра программы выделяется новый экземпляр буфера..), "статический для процесса" (один экземпляр буфера на процесс - это предполагает) или статично для библиотеки (libc) (столько экземпляров буфера, сколько экземпляров библиотеки (-фрагментов))?

(Я знаю о вопросе № 8694365, но мой немного отличается.)


person Community    schedule 06.03.2017    source источник
comment
Нет такой вещи, как экземпляр библиотеки. Если стандарт C говорит, что вы можете использовать localtime, и ваша программа придерживается стандарта (т. е. не использует такие вещи, как потоки), то вы можете использовать localtime. Вот для чего нужен стандарт.   -  person n. 1.8e9-where's-my-share m.    schedule 06.03.2017
comment
Не могу не подчеркнуть: не существует такой вещи, как экземпляр библиотеки.   -  person R.. GitHub STOP HELPING ICE    schedule 06.03.2017
comment
@R - это зависит от компилятора. gnu имеет небезопасную для потоков версию локального времени, в то время как местное время Visual Studio всегда кажется потокобезопасным. Библиотеки DLL можно рассматривать как один экземпляр для каждой системной библиотеки. Статические библиотеки можно рассматривать как один экземпляр на процесс. В Windows есть область данных для каждого потока, чтобы по мере необходимости можно было использовать потокобезопасные библиотеки. Я не знаю, как системы Posix реализуют это.   -  person rcgldr    schedule 06.03.2017
comment
@R..: в процессе может быть только один экземпляр общего объектного файла, но ничто не мешает мне загрузить одну и ту же библиотеку (или библиотеку с одинаковыми внешними определениями) из двух разных файлов. Или из статической и динамической компоновки одной и той же библиотеки. В обоих этих случаях будет замечено, что статически размещенный объект принадлежит библиотечному объекту, а не процессу в целом, что часто приводит к проблемам.   -  person rici    schedule 06.03.2017
comment
@rici: В этом случае ваша программа имеет UB (повторяющиеся определения), и то, что происходит, выходит за рамки языка C.   -  person R.. GitHub STOP HELPING ICE    schedule 07.03.2017
comment
@rcgldr: Нет, MSVC просто не соответствует требованиям. C указывает статическое хранилище; если он использует локальное хранилище потока, поведение будет явно неправильным, когда вы читаете объект после выхода из потока, в котором была вызвана функция. (например, pthread_exit(localtime(t));)   -  person R.. GitHub STOP HELPING ICE    schedule 07.03.2017
comment
@R - это комбинация MSVC и Windows. Windows имеет область данных для каждого потока, которая существует за пределами обычного локального хранилища потока. Например, начальное значение для rand() — это одна из переменных, хранящихся в области данных для каждого потока. Ядро Windows управляет данными для каждого потока иначе, чем локальным хранилищем потока. FS (или GS?) может использоваться для доступа к данным для каждого потока или для отображения данных для каждого потока в виртуальное адресное пространство процесса.   -  person rcgldr    schedule 07.03.2017


Ответы (1)


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

person laarmen    schedule 06.03.2017