Re: Find error
On Thu, 29 Nov 2007 23:42:52 -0800 (PST), yayalee1983@gmail.com wrote:
is there any error in the following code?
Apart from the obvious problems preventing successful
compilation, I'll point one less obvious one:
void changebackgroud(std::istream& new)
{
lock(&fmutex);
delete fimage;
++changnum;
fimage=new image(new);
unlock(&fmutex);
}
If 'new' throws an exception here, fmutex remains
locked (unlock is not on the return path) and nobody
can lock it again.
Instead of littering all code with try...catch constructs,
I usually solve these by putting all the cleanup operations
in an ad-hoc scoped destructor.
For example:
void foo()
{
struct autolockmutex
{
mutex& m;
autolockmutex(mutex& mm) : m(mm) { lock(&m); }
~autolockmutex() { unlock(&m); }
} autounlock(fmutex);
...all the normal function code here...
...except the mutex handling. ...
}
This way, no matter which way the function is exited*,
autolockmutex() will unlock the mutex at the end
of the function's scope.
Of course, this is so a common usecase that it is better
to create a global scoped lock class for the purpose.
To limit the scope in which the mutex is locked, you
can instantiate the autoclass inside a {} scope; it
will unlock it at the end of that scope, regardless
of the exit path.
*) except abort(), crash, etc...
--
Joel Yliluoma - http://iki.fi/bisqwit/