473,322 Members | 1,421 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,322 software developers and data experts.

Recursion and locking

Hi,
I have a datastructure that sorts elements by a key. Now in some
circumstances a key may occur twice and so I would like to change the
old key value by adding 1.

To do this I am doing it recursively within a lock statement. My
problem is that since the myQueue is already locked, if the method is
called again recursively, should it block on the lock statement till
the lock is released?

public void Postpone(key)
{
lock(myQueue)
{
object = myQueue.Remove(key);
try
{

myQueue.Add(object, key+1);
}
catch(Exception)
{
Postpone(key+1);
}
}
}
Can somone help me out
Thanks in Advance

Nov 17 '05 #1
5 1551
why not move the lock to outside of the Postpone method, i.e. the calling
method locks around the call to Postpone not inside the Postpone method

HTH

Ollie Riches

"Curious" <th****@mail.global.net.mt> wrote in message
news:11*********************@g14g2000cwa.googlegro ups.com...
Hi,
I have a datastructure that sorts elements by a key. Now in some
circumstances a key may occur twice and so I would like to change the
old key value by adding 1.

To do this I am doing it recursively within a lock statement. My
problem is that since the myQueue is already locked, if the method is
called again recursively, should it block on the lock statement till
the lock is released?

public void Postpone(key)
{
lock(myQueue)
{
object = myQueue.Remove(key);
try
{

myQueue.Add(object, key+1);
}
catch(Exception)
{
Postpone(key+1);
}
}
}
Can somone help me out
Thanks in Advance

Nov 17 '05 #2
Good idea......Thanks

Nov 17 '05 #3
Curious wrote:
I have a datastructure that sorts elements by a key. Now in some
circumstances a key may occur twice and so I would like to change the
old key value by adding 1.

To do this I am doing it recursively within a lock statement. My
problem is that since the myQueue is already locked, if the method is
called again recursively, should it block on the lock statement till
the lock is released?


No - Monitor.Enter (which is what happens under the hood) effectively
just increments the lock count if you lock it within the same thread.
In other words, the lock is recursive.

See http://www.pobox.com/~skeet/csharp/t.../locking.shtml (half way
down) for more on this.

Jon

Nov 17 '05 #4
Curious,

No, it will not. Since the calls are occuring on the same thread, you
will not be blocked.

However, it is a bit inefficient, and it would be better if you did
something like this:

public void Postpone(int key)
{
// Lock on the queue.
lock (myQueue)
{
InternalPostpone(key);
}
}

private void InternalPostpone(int key)
{
object = myQueue.Remove(key);
try
{
myQueue.Add(object, key+1);
}
catch(Exception)
{
InternalPostpone(key+1);
}
}

This way, you don't have excessive locks being allocated on the same
thread.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- mv*@spam.guard.caspershouse.com

"Curious" <th****@mail.global.net.mt> wrote in message
news:11*********************@g14g2000cwa.googlegro ups.com...
Hi,
I have a datastructure that sorts elements by a key. Now in some
circumstances a key may occur twice and so I would like to change the
old key value by adding 1.

To do this I am doing it recursively within a lock statement. My
problem is that since the myQueue is already locked, if the method is
called again recursively, should it block on the lock statement till
the lock is released?

public void Postpone(key)
{
lock(myQueue)
{
object = myQueue.Remove(key);
try
{

myQueue.Add(object, key+1);
}
catch(Exception)
{
Postpone(key+1);
}
}
}
Can somone help me out
Thanks in Advance

Nov 17 '05 #5
Yes, after Ollie Riches comment, I did as you gave in your sample code.

Nov 17 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Peri | last post by:
I'm trying to create Python parser/interpreter using ANTLR. Reading grammar from language refference I found: or_expr::= xor_expr | or_expr "|" xor_expr For me it looks like infinite recursion....
43
by: Lorenzo Villari | last post by:
I've tried to transform this into a not recursive version but without luck... #include <stdio.h> void countdown(int p) { int x;
20
by: athar.mirchi | last post by:
..plz define it.
35
by: Muzammil | last post by:
int harmonic(int n) { if (n=1) { return 1; } else { return harmonic(n-1)+1/n; } } can any help me ??
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.