Date: Tue, 12 Sep 2000 15:54:17 -0400 (EDT) From: Daniel Eischen <eischen@vigrid.com> To: Jason Evans <jasone@canonware.com> Cc: Matthew Jacob <mjacob@feral.com>, arch@FreeBSD.ORG Subject: Re: Necessary synchronization primitives (was Re: cvs commit: [...] yarrow.c [...]) Message-ID: <Pine.SUN.3.91.1000912153601.24958A-100000@pcnet1.pcnet.com> In-Reply-To: <20000912113445.F31089@blitz.canonware.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 12 Sep 2000, Jason Evans wrote: > Executive summary: My experience has indicated that 1) mutexes, 2) > condition variables, 3) barriers, and 4) message queues are an adequate set > of locking primitives for almost any problem. > > I've been drooling over threads since being introduced to OS/2 in 1992. I > actually started using threads in significant ways in about 1996. The last > 5 years have taught me a few lessons about what is useful versus what > sounds good on paper. To make it clear where this email is going, I'll > start off by saying "reader/writer locks are rarely useful", and later on > will add support to that opinion. > > Here's a laundry list of synchronization primitives, in approximately > increasing order of complexity: > > * mutex {blocking, spinning, adaptive, recursive} > > Simple mutual exclusion lock, in many flavors. Only one thread can own a > mutex at a time. > > - blocking > > If a thread tries to acquire a mutex that is already owned, the thread > will block until it is granted the mutex (i.e. the previous owner > releases the mutex). > > - spinning > > If a thread tries to acquire a mutex that is already owned, the threads > spins in a tight loop, trying again and again to acquire the mutex > until it succeeds. Spin mutexes tend to be very dangerous and > difficult to use correctly. In userland, spinning mutexes are almost > always a bad idea (though not *always*). In the kernel, and in > threading library implementations, there are decidedly legitimate > reasons for using spinning mutexes. > > - adaptive > > A spinning mutex that blocks after a certain amount of spinning. In > userland programming, these pretty much remove any need for pure > spinning mutexes. > > - recursive > > A thread can acquire the same mutex more than once, recursively. Until > the SMP work, I never used recursive mutexes. In my opinion, if > recursive mutexes are needed to solve a programming problem, then the > problem needs to be re-thought. That is, recursive mutexes are a > crutch, not a necessity. However, given that we're converting an old > piece of code to being threaded, there are a number of places where > recursive mutexes save us from having to rip major portions of the > kernel to pieces. Hopefully we can keep recursive mutex use to a > minimum, but from a pragmatic point of view, we need them, at least > for now. I agree with everything you've said here, elsewhere in this Email, and in recommending the Butenhof book. I also want to add that I hate recursive mutexes :-) Perhaps now is not the right time, but I'd like to see our kernel mutex (mtx) not support recursve mutexes. We could provide a different set of functions (and perhaps a different data structure) that would be optimized explicitly for recursive mutexes (still discouraging their use). This would hopefully help us in eliminating the hideous flags needed for mtx_enter(), instead relying on the flags provided at mtx_init() time. -- Dan Eischen To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.1000912153601.24958A-100000>