template<typename Lockable>
class boost::testable_mutex< Lockable >
Based on Associate Mutexes with Data to Prevent Races, By Herb Sutter, May 13, 2010 http://www.drdobbs.com/windows/associate-mutexes-with-data-to-prevent-r/224701827?pgno=3.
Make our mutex testable if it isn't already.
Many mutex services (including boost::mutex) don't provide a way to ask, "Do I already hold a lock on this mutex?" Sometimes it is needed to know if a method like is_locked to be available. This wrapper associates an arbitrary lockable type with a thread id that stores the ID of the thread that currently holds the lockable. The thread id initially holds an invalid value that means no threads own the mutex. When we acquire a lock, we set the thread id; and when we release a lock, we reset it back to its default no id state.