Have had to write my first "proper" multithreaded coded recently, and realised just how little I knew about how "imperative-style" (ie, concurrency models used by C++/C#/Java, and the like) concurrent programming techniques.
What resources are there (both books and online tutorials, etc) in order to learn more about this area of coding-fu?
NB: I'm not asking about concurrency models that are arguably better (Erlang's message passing, or Clojure's STM), just paradigms used in imperative languages.