Потоковая безопасность стандартной библиотеки C на OS X - PullRequest
8 голосов
/ 05 декабря 2011

Есть ли полный список функций, которые являются поточно-ориентированными в реализации Mac OS X стандартной библиотеки C?

Здесь есть хороший ответ здесь относительно функций glibc и f*(), но я не смог найти ни одного такого ресурса относительно OS X. Есть ли такая вещь?

Например, strptime() и strftime() поточно-ориентированы? printf()? Это те, которые могут иметь внутренние буферы, которые я не хотел бы испортить. :)

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Спецификация Single Unix дает довольно короткий список функций, которые могут быть не поточно-безопасными (за исключением того, что функции в "Legacy Feature Group" могут быть не поточно-безопасными несмотря на то, что там их нет). В список входят strtok(), о которых Дейв упоминает в своем ответе, но не включает strptime(), strftime() и printf().

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

2 голосов
/ 05 декабря 2011

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

Многие функции, о которых вам действительно нужно беспокоиться, возвращают char* или struct foo*.Хотя это не идеальное правило, оно часто указывает на функцию, которая имеет какое-то статическое хранилище и не является поточно-ориентированной.

strtok() является простым примером is, и за ним следует strtok_r(), который является потокобезопасным.Для многих не поточно-ориентированных функций существует function_r() (r для реентерабельного), который есть.

...