views:

65

answers:

3

I would like to know if there are any guidelineswhich a developer should follow as to when (and where) to place locks.

For instance: I understand that code such as this should be locked, to avoid the possibility of another thread changing the value of SomeHeapValue unexpectedly.

class Foo
{
  public SomeHeapObject myObject;
  public void DoSummat(object inputValue_)
  {
    myObject.SomeHeapValue = inputValue_;
  }

}

My question is, however, how deep does one go with the locking? For instance, if we have this code:

class Foo
{
  public SomeHeapObject myObject;
  public void DoSummat(object inputValue_)
  {
    myObject.SomeHeapValue = GetSomeHeapValue();
  }

}

Should we lock in the DoSummat(...) method, or should we lock in the GetSomeHeapValue() method?

Are there any guidelines that you all keep in mind when strcturing multi-threaded code?

+2  A: 

The best guide for locking and threading I found, is this page (this is the text I consult when working with locking and threading):

http://www.albahari.com/threading/

Yo want the paragraph "Locking and Thread Safety", but read the rest also, it is very well written.

thanks that is useful...but why do all examples use static member variables? there are issues with thread-safety in class member variables as well, right?
miguel
@miguel: it is possible to lock instance member by using "lock(this)", explanation and Example2 on this page provide more details: http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.71%29.aspx. I think that on Albahari site he is using static because then he does not have to make an instance of a class, which makes his examples shorter.
@miguel: your lock object needs to be shared across threads to be usable, and static is a clean and easy way to do this. Static is not inherently evil, just misused like the globals of old.
ebpower
+2  A: 
  • Lock as little as possible, but as much as needed.

  • Avoid locks when possible - in .NET 4.0 there are alternatives that are not causing a context switch.

  • Try not to lock multiple times. Structure your API accordingly. For example a queue. DeQueue - make an alternative DeQueue(int amount) that can dequeue many items with one lock.

TomTom
A: 

How about message passing instead of locking, debugging locking code is hard

TiansHUo