Blog Archive for / 2011 / 06 /
Simplify Code by Encapsulating Locks
Wednesday, 15 June 2011
Over on the Future Chips blog, Aater Suleman argues
that while(1)
can make parallel code better. Whilst I agree that the code
using while(1)
is simpler than the original in terms of
analysing the lock patterns, it achieves this by testing the logical
condition inside the while
and
using break
. This is additional, unnecessary,
complexity.
What is wanted instead is a way of encapsulating the locking, so that the loop logic is simple, and yet the lock logic is also clear.
Here is the original code from the blog post:
lock_acquire(lock); while(check_condition()){ lock_release(lock); //do any actual work in the iteration - Thanks to Caleb for this comment lock_acquire(lock); } lock_release(lock);
The implication here is that check_condition()
must be
called with the lock held, but the lock need not be held for the
actual iteration work. The code thus acquires and releases the mutex
in two places, which is unnecessary duplication, and a potential
source of errors — if the loop exits early then the lock may
be released twice, for example.
Rather than moving the condition check into the loop to avoid this duplication, a better solution is to move the lock acquisition and release into the condition check:
bool atomic_check_condition() { lock_acquire(lock); bool result=check_condition(); lock_release(lock); return result; } while(atomic_check_condition()){ //do any actual work in the iteration - Thanks to Caleb for this comment }
This gives us the best of both worlds: the lock is now held only
across the check_condition()
call, but the logic of
the while
loop is still clear.
If you're programming in C++, then the C++0x library allows us to
make atomic_check_condition()
even simpler by
using lock_guard
as in the code below, but extracting
the function is always an improvement.
bool atomic_check_condition() { std::lock_guard<mutex_type> guard(lock); return check_condition(); }
Posted by Anthony Williams
[/ threading /] permanent link
Tags: multithreading, concurrency, locks
Stumble It! | Submit to Reddit
| Submit to DZone
If you liked this post, why not subscribe to the RSS feed or Follow me on Twitter? You can also subscribe to this blog by email using the form on the left.
Just::Thread now supports GCC on Windows and MacOSX
Tuesday, 14 June 2011
I am pleased to announce that support for
the TDM port of gcc 4.5.2
for Windows and the MacPorts
builds of gcc 4.3, 4.4 and 4.5 have now been added
to just::thread
.
This release thus greatly improves the portability of the
library. You can now write code
using just::thread
that will work across Windows, Linux and MacOSX. With gcc 4.5
support across all 3 platforms, you can take advantage of the
extensive C++0x language support from that compiler too, including
lambda functions, rvalue references and variadic templates.
Get your copy now and add portability to your multithreaded programs.
Posted by Anthony Williams
[/ news /] permanent link
Tags: just::thread, cplusplus, multithreading, gcc, windows, macosx
Stumble It! | Submit to Reddit
| Submit to DZone
If you liked this post, why not subscribe to the RSS feed or Follow me on Twitter? You can also subscribe to this blog by email using the form on the left.
Design and Content Copyright © 2005-2025 Just Software Solutions Ltd. All rights reserved. | Privacy Policy