Message from discussion
code pattern for locking & unlocking
Path: g2news2.google.com!news2.google.com!npeer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!news.alt.net
From: Daniel Anderson <woni...@gmail.com>
Newsgroups: comp.lang.c++.moderated,comp.lang.c++
Subject: Re: code pattern for locking & unlocking
Date: Sun, 28 Nov 2010 08:39:01 CST
Organization: http://groups.google.com
Lines: 132
Sender: lang-cpp-requ...@vandevoorde.com
Approved: dietmar_ku...@yahoo.com
Message-ID: <958cad40-ab05-41e9-9359-f8ef4f90e21b@n32g2000pre.googlegroups.com>
References: <49689abb-9b1c-49f1-a1f0-d85b8be973fc@g25g2000yqn.googlegroups.com>
<471a7068-5fc9-406a-bb2b-f0f2bab96f1f@j33g2000vbb.googlegroups.com>
Content-Type: text/plain; charset=ISO-8859-1
To: undisclosed-recipients:;
Return-Path: <cppm...@mcgurn.dreamhost.com>
X-Original-Date: Sat, 27 Nov 2010 11:51:51 -0800 (PST)
X-Submission-Address: lang-c++-sub...@vandevoorde.com
On Nov 26, 8:22 pm, "Hak...@gmail.com" <hak...@gmail.com> wrote:
> On Nov 25, 5:48 pm, Daniel Anderson <woni...@gmail.com> wrote:
>
>
>
>
>
>
>
>
>
>> Hi!
>
>> I often have to acquire locks and release them after I'm finished with
>> them.
>> I use constructor/destructor to acquire & release locks. everything
>> works fine.
>> sometime I must acquire a lock for few instructions, then release it
>> in the middle of a big function. I use braces to get timely
>> destructors, but I find the "middle of nowhere" braces kind of
>> embarrassing.
>> something like:
>
>> struct Lock
>> {
>> Lock(Mutex& mtx) mtx_(mtx) { mtx.lock(); }
>> ~Lock() { mtx_.unlock(); }
>> operator bool() { return true;}
>
>> };
>
> Since your Lock type depends on Mutex, why not just use the straight
> Mutex and lock and unlock as you please?
Because of exception!
>
>> void someFunc()
>> {
>> // do some stuff
>> ...
>> // now time to update share data
>> {
>> Lock myLock(data_mutex);
>> //use locked data
>> ....
>> } // destructor called
>> // do more stuff
>> ...
>
>> }
>
> Some don't even know or haven long forgotten that you can create
> blocks arbitrarily like this. I agree that it doesn't look nice, but
> it has a lot of uses and i think there's nothing wrong with using it.
> It's an incredibly simple and elegant way of solving this problem.
Simple, yes. I've doing it for a long time
elegant, I use to think so, until someone remove some braces in my
code that where there for RAII, since I do not think it is elegant
>
>> I would like to have something like the using keyword in c#.
>> Is there a way to fake it in C++ ?
>
> This is a C++ forum. C# is relevant to this question, but for those of
> us who haven't worked with it, please post a short example.
>
>
>
>
>
>
>
>
>
>> for now I'm using an if to do it.
>
>> void someFunc()
>> {
>> // do some stuff
>> ...
>> // now time to update share data
>> if (Lock myLock = Lock(data_mutex))
>> {
>> //use locked data
>> ....
>> } // Unlock done by destructor
>
>> // do more stuff
>> ...
>
>> }
>
> You seem to be implying that this if statement will always evaluate to
> true (since i assume this code is equivalent to your first example),
> but when i see an "if" in any code, i always assume that it will
> sometimes not evaluate to true. On the other hand, it reminds me of
> this:
> std::weak_ptr<int> wp;
> void f() {
> if( std::shared_ptr<int> sp = wp.lock() )
> ; // do something
> }
>
>> Is it good programming ?
>
> What a subjective question!
according to Plato (or was it Socrates) good is not subjective :)
>
>> Is there a better way ?
>
> I think creating an arbitrary scope is one of the simplest and least
> error prone ways to do this. I'm sure at least one person (if not you)
> will disagree with me, but i like simple. I suppose you could create a
I do not disagree, I'm just looking for advice
> class that inputs a function, locks, calls the function, then unlocks,
> and you could use C++0x lambdas to integrate it into your current code
> without too much refactoring, but that means you'll have to maintain
> the locking class and every function/class/etc that uses it. I guess
> i'm not the most articulate so i'll use someone else's words:
> "Perfection is achieved not when you have nothing more to add, but
> when you have nothing left to take away." ~ Antoine de Saint-Exupery.
this is a good guy this Antoine.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]