[dba-VB] c# lock()

jwcolby jwcolby at colbyconsulting.com
Fri Mar 25 16:38:19 CDT 2011


When you say resource, you mean variable?

IOW use

private static Object LockBln = new Object();
private static Object LockDte = new Object();

and use the LockBln to lock the boolean object while using LockDte to lock the date object?

John W. Colby
www.ColbyConsulting.com

On 3/25/2011 5:05 PM, Shamil Salakhetdinov wrote:
> Hi John --
>
> Your sample is a correct usage of locking - just use static thisLock
> variable
>
> private static Object thisLock = new Object()
>
> as non-static variable *is not* thread safe AFAIU.
>
> Yes, such locking can be done for various operations of that class - just
> make sure you'll not get dead-locked...
> Also use *one lock object* to lock *one resource* in a class - otherwise
> "deadlock" will become your "everyday guest"...
>
> Thank you.
>
> --
> Shamil
>
> -----Original Message-----
> From: dba-vb-bounces at databaseadvisors.com
> [mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: 25 ????? 2011 ?. 22:58
> To: Discussion concerning Visual Basic and related programming issues.
> Subject: Re: [dba-VB] c# lock()
>
> 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
>>
>>
> _______________________________________________
> 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