Comparing shared_mutex and other Synchronization Primitives in C++