Another alternative (if you want to write a multi-threaded runtime that allows its clients to request a fork) is to implement your own memory allocation routines that use robust mutexes, along with appropriate cleanup routines for the EOWNERDEAD case.
This may be easier said than done.