add SpinLock
WITH_LOCK macro to ease std::lock_guard