Фон в этот вопрос мой. Короче говоря, я должен fork
в многопоточной программе на C ++, поэтому я хотел бы выяснить, что я могу сделать, если ограничен только повторяемыми функциями, и одна из самых важных вещей — это динамическая память.
Так, malloc
является известно, что не реентерабельный. Но как насчет C ++ new
? Я прибегнул к этому с небольшим количеством релевантных результатов (в основном из-за трудностей с выбором правильного «нового»), но есть по крайней мере одно утверждение, что new
является входящий угол. Также есть соответствующий вопрос относительно всей стандартной библиотеки C ++ без удовлетворительного ответа.
Изменить: я думаю, что стандарт ничего не сказал об этом, поэтому я в основном обеспокоен основными реализациями.
Я посмотрел как gcc
libsupc ++ а также clang
Libc ++ источник, для замены стандартных / новых операторов удаления / удаления C ++ — для поддержки собственных требований выравнивания SIMD на платформах, где это не гарантировалось malloc
,
Они в основном обертки для malloc
а также free
с некоторой логикой EH и т. д. Я не являюсь юристом по языку, но если оба не ошибаются, я думаю, что можно с уверенностью сделать вывод: нет, они не возвращаются.
Потокобезопасность и повторный вход не именно так тот же самый.
AFAIK, стандарт C ++ ISO не гарантирует потокобезопасность для new
а также delete
операторы. Но g++
Реализация обеспечивает потоковую безопасность (и это одна из причин того, что она медленная).
стандарт позволяет new
быть просто обёрткой malloc
, так что если malloc
может быть не реентерабельным, так может new
,