Ah, I knew I'd get a response!
There's basically two concurrency models, threading and tasking.
Threading says that the level of abstruction for concurrency is usually
below the level of abstraction for the object level, tasking says
that it is above. A task is basically one or more
objects with a thread of control. A thread is basically one
or more execution paths through an object. They overlap when
you have a one-to-one mapping from threads to objects. Tasking
has build in synchronization semantics, threading does not.
Then there's also the whole other camp who say that concurrency
should't even have to be explicit.
Come on Joe. You work for Microsoft who claims to know the pulse of the
90% of all developer's. Please tell us if 97% of them can recognize
a deadlock or livelock situation.