forked from OSchip/llvm-project
Despite my pathological distrust of spin locks, the number just don't lie. I've put a small spin in __sp_mut::lock() on std::mutex::try_lock(), which is testing quite well. In my experience, putting in a yield for every failed iteration is also a major performance booster. This change makes one of the performance tests I was using (a highly contended one) run about 20 times faster.
llvm-svn: 160967
This commit is contained in:
parent
ebcd1c7ca2
commit
088e37c77a
|
@ -10,6 +10,7 @@
|
|||
#define _LIBCPP_BUILDING_MEMORY
|
||||
#include "memory"
|
||||
#include "mutex"
|
||||
#include "thread"
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
|
@ -129,13 +130,23 @@ _LIBCPP_CONSTEXPR __sp_mut::__sp_mut(void* p) _NOEXCEPT
|
|||
void
|
||||
__sp_mut::lock() _NOEXCEPT
|
||||
{
|
||||
reinterpret_cast<mutex*>(_)->lock();
|
||||
mutex& m = *static_cast<mutex*>(_);
|
||||
unsigned count = 0;
|
||||
while (!m.try_lock())
|
||||
{
|
||||
if (++count > 16)
|
||||
{
|
||||
m.lock();
|
||||
break;
|
||||
}
|
||||
this_thread::yield();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
__sp_mut::unlock() _NOEXCEPT
|
||||
{
|
||||
reinterpret_cast<mutex*>(_)->unlock();
|
||||
static_cast<mutex*>(_)->unlock();
|
||||
}
|
||||
|
||||
__sp_mut&
|
||||
|
|
Loading…
Reference in New Issue