Является ли memcpy () / mktime () поточно-ориентированным на iOS и Android? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть библиотека C, которую я кросс-компилирую для использования в приложениях для Android и iOS.

Используются memcpy() и mktime(), поэтому я хочу знать, являются ли эти функции неявно поточно-ориентированными при использовании в многопоточных средах.

Приложения iOS, скомпилированные с современными библиотеками Xcode и Android, скомпилированные с современным Android NDK, используют компилятор clang на основе LLVM.

Я рассмотрел следующие вопросы, но не смог найти однозначного ответа:

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

POSIX требует соответствующих реализаций, чтобы все стандартизированные им функции были поточно-ориентированными, за исключением относительно короткого списка функций. memcpy() и mktime() оба охватываются POSIX, и ни одно из них не входит в список исключений, поэтому POSIX требует, чтобы они были поточно-ориентированными (но читаются дальше).

Обратите внимание, однако, что дело не в используемом компиляторе, а в библиотеке C, поддерживающей ваше приложение. Я помню, что библиотеки Apple C в некоторых областях не соответствовали требованиям. Тем не менее, ничего особенного в memcpy() и mktime() нет, что делает их по сути рискованными с точки зрения безопасности потоков. То есть, нет никаких оснований ожидать, что они получат доступ к каким-либо общим данным, , кроме тех, которые предоставлены им через их аргументы .

И есть руб. Вы можете положиться на memcpy() и mktime(), чтобы, скажем, не полагаться внутренне на статические данные, но требования POSIX к безопасности потоков не распространяются на работу, описанную в документах, в отношении гонок данных, которые вы создаете с помощью выбора аргументов. Таким образом, например, если два разных потока вызывают memcpy(), и целевая область одного вызова перекрывает либо исходную, либо целевую область другого, тогда вам потребуется некоторая разновидность синхронизации между потоками.

0 голосов
/ 03 июля 2018

Вопрос о том, является ли memcpy() поточно-ориентированным, может быть дискуссионным.

Я бы сказал, что memcpy() действительно потокобезопасен. Он не зависит от (глобального) состояния, которое может быть повреждено несколькими экземплярами memcpy(). Это, однако, не означает, что существует некоторая магия, препятствующая области памяти, которая одновременно назначение копирования нескольких потоков, выполняющих memcpy(), плохо искажено, т.е. процесс копирования в целом не атомарный . Вы должны заботиться о себе, используя мьютексы , чтобы обеспечить атомарность.

mktime() тривиально поточно-безопасен, поскольку не использует статические буферы, не использует глобальное состояние или подобное. На странице руководства упоминается, что некоторые функции из этого семейства не поточно-безопасны (у них есть соответствующие функции * _r), но mktime() не входит в число этих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...