Безопасны ли потоки memmove и malloc? - PullRequest
5 голосов
/ 06 апреля 2011

У меня есть код, который перемещает байты в буфере, используя memmove(). Доступ к буферу осуществляется несколькими потоками. Я получаю очень странное поведение; иногда буфер не тот, каким он должен быть, и я думал, если memmove() или / и malloc() потокобезопасны. Я работаю на iOS (в случае, если это зависит от платформы).

Ответы [ 5 ]

6 голосов
/ 06 апреля 2011

В реализации, предоставляющей потоки, malloc обычно будет безопасным для потоков (т. Е. Будет предприняты шаги, чтобы гарантировать, что куча не будет повреждена, даже если malloc вызывается из нескольких потоков).Точный способ, которым это будет происходить, варьируется: некоторые используют одну кучу и внутреннюю синхронизацию для предотвращения коррупции.Другие будут использовать несколько куч, поэтому разные потоки могут распределять память одновременно без коллизий.

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

3 голосов
/ 06 апреля 2011

Вы должны использовать мьютекс ( NSLock ) в качестве защитного барьера для доступа к вашему буферу.Взгляните на Синхронизация в Apple Руководство по программированию потоков .

2 голосов
/ 06 апреля 2011

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

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

1 голос
/ 06 апреля 2011

Поскольку текущий стандарт C не определяет потоки, ему нечего сказать о безопасности потоков.Всякий раз, когда у вас есть потоки, вы имеете дело с системой, которая предъявляет дополнительные требования, помимо требований основного стандарта языка C, к поведению функций стандартной библиотеки.Я не уверен, какие требования предъявляет iOS, но POSIX и Windows требуют, чтобы malloc был поточно-ориентированным, и мне было бы трудно поверить, что любая система, разработанная после середины 90-х годов, не будет выполнять это требование.

Обратите внимание, что в следующем стандарте C1x будут определены потоки, и если в реализации есть потоки, то malloc должен быть ориентирован на многопоточность.

0 голосов
/ 06 апреля 2011

Нет, поскольку стандартная библиотека C не имеет понятия о потоках, функции, которые она определяет, не могут быть.

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