I derived a unit test from the attached sample test (tests/src/threadtest.cpp) and have added it to the project and have addressed two issues that may have been responsible for some of the observed segmentation faults.
The implementation of ObjectPtrT::operator=() in include/log4cxx/helpers/objptr.h was not atomic. In particular, releaseRef() was called on the existing value while the existing value was still visible which could result in jumping to a destructed object. I've modified the template to use APR's apr_atomic_casptr (doesn't seem to be a plain exchange ptr method) to exchange the old pointer and new pointer values and delayed release until after the pointers are exchanged.
Hierarchy::shutdown did not have a synchronization block. Without it ThreadTest::testMultiThreadAndShutdown would fail as loggers would be requested while the hierarchy was in a partially shutdown state.
The Pool parameter was removed from Thread::run() as the pool was expected to last as long as the object. If you did (as I did in an earlier version of ThreadTest):
thread.run(p, runnable, 0);
You would get a crash on the join as APR threads created in the run method would have been deleted when the pool went out of scope.
The ThreadTest still fails on Windows due to Hierarchy::getLogger() apparently returning null loggers.