问题
The background is in this question of mine. Put shortly, I have to fork
in a multithreaded C++ program, so I'd like to figure out how much I can do when restricted to reentrant functions only, and one of the most essential things is dynamic memory.
So, malloc
is known to be non-reentrant. But what about C++'s new
? I googled for that with not many relevant results (mostly due to the difficulty to hit the correct "new"), but there is at least one claim that new is reentrant. There is also a relevant question concerning the whole C++ standard library with no satisfying answer.
Edit: I guess the standard didn't say anything about this, so I'm mostly concerned about major implementations.
回答1:
I've looked at both the gcc
libsupc++ and clang
libc++ source, for replacing the standard-conforming C++ new/delete operators - to support native SIMD alignment requirements on platforms where it wasn't guaranteed by malloc
.
They are basically wrappers for malloc
and free
with some EH logic, etc. I am not a language lawyer, but unless both have it wrong, I think it's safe to conclude: no, they are not reentrant.
回答2:
Standard allows new
to be just a wrapper around malloc
, so if malloc
can be not reentrant, so can new
.
回答3:
Thread-safety and re-entrance are not exactly the same.
AFAIK, the C++ ISO standard does not guarantee thread-safety for new
and delete
operators. But g++
implementation does provide thread-safetly (and it's one of the reasons it's slow).
来源:https://stackoverflow.com/questions/14090589/is-cs-new-operator-reentrant-or-async-safe