Delphi's TThread
Was and Is great but also sucked some serious butt in many respects. The lack of any provided mechanisms for simple messaging between threads was one, the lack of a provided pooling mechanism or any flexibility in thread lifetime management, the fact that the app main thread wasn't actually represented by a TThread was another. etc.
Fortunately Delphi being what it is, and with full source provided, the VCL TThread class itself proved invaluable to me in gaining an understanding of the Windows thread related API's and gave me a great jumping off point to create my own far richer and more flexible threading support for my Delphi code, taking all the great things that TThread did and adding SOOO much more.
And yes, making hard jobs easier for those who don't fully understand the problems they are grappling with is a fundamental pillar on which the Law of Unintended Consequences rests.
Writing parallel code is easy.
Writing parallel code that works is not.
Unless of course you employ a (correct) implementation of the Active Object pattern, in which case massively parallel code can be written by pretty much anyone.