X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FMicroSpinLock.h;h=0453b35599ec3e526633171f386b6285d87679c8;hp=fde93357bc610238d5ae589a4fd820358f17a7f8;hb=00ff5917775f9b58a04f74835585cbb32e306289;hpb=321542683a01c3f334047531e9b487f047129775 diff --git a/folly/MicroSpinLock.h b/folly/MicroSpinLock.h index fde93357..0453b355 100644 --- a/folly/MicroSpinLock.h +++ b/folly/MicroSpinLock.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,22 @@ * limitations under the License. */ +/* + * N.B. You most likely do _not_ want to use MicroSpinLock or any + * other kind of spinlock. Consider MicroLock instead. + * + * In short, spinlocks in preemptive multi-tasking operating systems + * have serious problems and fast mutexes like std::mutex are almost + * certainly the better choice, because letting the OS scheduler put a + * thread to sleep is better for system responsiveness and throughput + * than wasting a timeslice repeatedly querying a lock held by a + * thread that's blocked, and you can't prevent userspace + * programs blocking. + * + * Spinlocks in an operating system kernel make much more sense than + * they do in userspace. + */ + #pragma once /* @@ -26,7 +42,6 @@ #include #include #include -#include #include #include @@ -89,6 +104,9 @@ struct MicroSpinLock { std::memory_order_relaxed); } }; +static_assert( + std::is_pod::value, + "MicroSpinLock must be kept a POD type."); //////////////////////////////////////////////////////////////////////