Malloc() не является реентерабельным, но потокобезопасным?

Возможный дубликат:
Malloc потокобезопасен?

Я немного не смущен, пока читаю "Интерфейс программирования Linux".

В книге говорится, что malloc не является реентерабельным, так как он манипулирует структурой данных глобального связанного списка, но делает потокобезопасным использование мьютекса.

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

Другой вопрос, что, поскольку malloc является потокобезопасным, можем ли мы поместить его в обработчик сигнала? Я думаю, что ответ да, но я не уверен, так как согласно этой книге, он говорит, что в обработчик сигнала может быть помещена только функция реентера или асинхронного сигнала.

Может кто-нибудь объяснить это мне?

Ответ 1

если мы говорим, что реентерабель означает, что он может быть вызван более чем одним вызывающего абонента в то же время

Неправильно. Реентерент означает , вы можете прервать его и называть его еще до того, как закончилось предыдущее воплощение. Представьте, что malloc выглядит так:

lock(mutex);

/* Stuff. */

unlock(mutex):

Что произойдет, если он прерван посередине, до разблокировки, а кто-то еще вызовет malloc?

  • Первый контекст не может продолжаться до тех пор, пока второй не будет выполнен.
  • Второй контекстный блок на мьютексе и не может продолжаться до тех пор, пока первый не разблокирует мьютекс

Это тупик.

Другой вопрос в том, что, поскольку malloc является потокобезопасным, можем ли мы его поместить в обработчике сигналов? Я думаю, что ответ "да"

Неправильно. См. Пример выше. Представьте, что основная программа выполняет malloc, и до того, как функция фактически завершит ваш обработчик, вызовите malloc.

Ответ 2

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

Функции библиотеки в C не гарантируются реентерабельными, и из обработчиков сигналов могут быть вызваны только реентерабельные функции.