[dba-VB] c# lock()

jwcolby jwcolby at colbyconsulting.com
Fri Mar 25 14:58:27 CDT 2011


Shamil,

Does this allow using a single "lock object" to lock various operations in a class.

For example I want to lock a date flag variable while using a property to either get or set the 
variable.

         private Object thisLock = new Object();

         public DateTime pFlagDte {
             get {
                 lock (thisLock)
                 {
                     return dteFlag;
                 }
             }
             set
             {
                 lock (thisLock)
                 {
                     dteFlag = value;
                 }
             }
         }

The issue is not multiple threads trying to write to the date variable but rather one thread trying 
to read it while another is writing it.

John W. Colby
www.ColbyConsulting.com

On 3/10/2011 5:51 PM, Shamil Salakhetdinov wrote:
> Hi John --
>
> Do you you need add, remove and iterate a list to get an object or you need
> to add, remove and get an object by its key? - if the latter - here is the
> code you can use:
>
> private Dictionary<int, MyObject>  _myObjects = new Dictionary<int,
> MyObject>();
> private static object _myObjectsLocker = new object();
> public void Add(MyObject myObject)
> {
>      lock (_myObjectsLocker)
>      {
>          _myObjects.Add(myObject.ID, myObject);
>          _keys.Add(myObject.ID);
>      }
> }
> public MyObject Remove(int id)
> {
>      MyObject myobject = null;
>      lock (_myObjectsLocker)
>      {
>          myobject = _myObjects[id];
>          _myObjects.Remove(id);
>      }
>      return myobject;
> }
> public MyObject this[int key]
> {
>      get
>      {
>          MyObject myObject = null;
>          lock (_myObjectsLocker)
>          {
>              _myObjects.TryGetValue(key, out myObject);
>          }
>          return myObject;
>      }
> }
>
> for the case of iteration just replace:
>
> _myObjects.TryGetValue(key, out myObject);
>
> with your iteration code.
>
> As for the sample code - changing qty of threads and changing total computer
> workload (outer context for the test code) you can see how different could
> be final results when heavy multi-threading is used. And even if it's not
> heavy - it still can result in weird output if special multi-threading
> coding technique aren't used...
>
> Thank you.
>
> --
> Shamil
>
> -----Original Message-----
> From: dba-vb-bounces at databaseadvisors.com
> [mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: 11 ????? 2011 ?. 1:27
> To: Discussion concerning Visual Basic and related programming issues.
> Subject: Re: [dba-VB] c# lock()
>
> Shamil,
>
> Thanks for the code but I think it is overkill for my needs so far, though I
> will put it in the archives for when I need it.
>
> In my system so far I have (or can arrange  to have ) only two threads
> trying to access a list.
>
> Basically what I am doing is reading records out of sql server into a class
> factory, and placing the class instances into a list.
>
> Another object with its own thread is coming by and looking at the objects
> in the list to see if there is any work for it to do.  If it finds an object
> to work on, it grabs a pointer to that item in the list and stores it in a
> pointer and releases the list.
>
> One of the ways I saw this handled was to create factory which creates a
> brand new list object, grabs a pointer to the list, locks that and then
> copies the objects in the list pointers to classes) into that new list,
> unlocks the list and hands back a pointer to this brand new list.  thus the
> new list could be iterated at will.
>
> I am just trying to lock the list while one thread adds objects to the list
> or another thread gets objects out of the list.
>
> So if I have object A which contains a list and is adding / deleting objects
> to that list...
> and object B which needs to iterate through the list looking for an object
> of interest in the list, and grabbing a pointer to that object, there is no
> way to do this without all of the code you wrote?
>
> John W. Colby
> www.ColbyConsulting.com
>
> On 3/10/2011 4:35 PM, Shamil Salakhetdinov wrote:
>>    Hi John --
>>
>> <<<
>> Does that in fact lock the list to other objects doing the same thing
>> (getting the list through that property)?
>>>>>
>> You have to lock/synchronize/serialize not the list itself but
>> simultaneous access to the list from different threads.
>> You'd better use special static object variable to implement locking.
>>
>> I will post sample code in my following posting here...
>>
>> Thank you.
>>
>> --
>> Shamil
> _______________________________________________
> dba-VB mailing list
> dba-VB at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/dba-vb
> http://www.databaseadvisors.com
>
> _______________________________________________
> dba-VB mailing list
> dba-VB at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/dba-vb
> http://www.databaseadvisors.com
>
>



More information about the dba-VB mailing list