[dba-VB] Thread safe list

jwcolby jwcolby at colbyconsulting.com
Fri Dec 3 14:15:43 CST 2010


I saw something about locking the object, then doing a deep copy and using the copy.  Have you ever 
done this?

My collections are always well under a hundred objects and the objects are just pointers (and the 
key) so it seems like a deep copy of the dictionary should be lightning fast.  Then I could use the 
ForEach on the copy and all would be right in the world.

 > (Advanced) thread-safe multi-threading is "another song" - a way more complicated than ordinary 
programming.

We have moved to using threads for every time intensive task, but also using events to signal that 
we are finished with a time intensive task.

For example we:

1) Build a database (fast) and then build a table, populate it with (tens of) millions of records 
and build a bunch of indexes (SLOW).  The table build can take minutes to complete.  We run that 
whole process on a thread and the very end of the process raises an event.  The event sets a flag 
and throws a status object up the chain for display on the form, then exits (the thread).

2) A thread then creates a chunk table, pulls a set of up to two million records into a table, 
creates indexes etc (slow - up to a minute or more) and then raises an event which sets a flag and 
throws a status object up the chain for display on the form.

3) A thread then BCPs out that chunk table (slow - up to a minute or more) and raises an event which 
sets a flag, and throws a status object up the chain for display on the form.

Steps 2 and 3 repeat until all records are BCPd to files on disk.

This all happens in a custom database class which has a collection of ProcessFile objects (each of 
which is a chunk).  A supervisor object (owns the ProcessFile objects) places ProcessFile objects 
into the collection in the database object. and the database object is responsible for getting the 
data out of SQL Server, getting the chunks, and BCPing them out.  So the supervisor and the database 
are both accessing the collection that holds the ProcessFile objects, each using its own thread.

All of that stuff is just "Stage1 - SQL Server to Staging".  We have other classes which manage 
getting these files into a VM for processing and getting the resulting (processed) files back from 
the VM and back into SQL Server.

This whole thing is morphing into a pretty well defined object model where each object has clearly 
defined responsibilities.  I say morphing because it evolved from about 50-80 user stored procedures 
out on sql server, manually executed by hand from a list written on paper.  Boy is C# / SQL Server 
faster, easier and more reliable than jwc keying stuff into a query window while reading a check 
list.  ;)

The key though is these collections where we place supervisors and ProcessFiles for processing, and 
these lists (the process file lists) are hit from two sides by independent threads - one placing 
items into the lists and the other getting them out of the lists for processing.  Fun, efficient but 
tricky.

John W. Colby
www.ColbyConsulting.com

On 12/3/2010 11:00 AM, Shamil Salakhetdinov wrote:
> Hi John --
>
> 1. Yes, static. Object ref isn't thread-safe AFAIU.
> 2. Yes, foreach isn't good. You can use
>
> int count = getCount(); // getCount should use locking
> for (int i=0; i<count; i++)
> {
>     MyClass obj = getObject(i); // getObject should use locking as well as to
> have try/catch	
> }
>
> Obvisouly while iterating that way you can loose/skip some items, which will
> be inserted/deleted by parallel threads.
>
> (Advanced) thread-safe multi-threading is "another song" - a way more
> complicated than ordinary programming.
> I'm not 100% sure my abive sample doesn't have some "hidden glitches".
>
> It' s time to master PLINQ, lamda-expressions, functional programming
> principles, RESTFul web services,.... to name a few.
>
> The above is a "to do learning list" for myself also :) - I'm not yet there.
> And I'm not sure I will find good enough time to master all that advanced
> stuff...
>
> Thank you.
>
> --
> Shamil



More information about the dba-VB mailing list