And the answer is, if you consider the whole of the programming space, that it's still a work in progress. There's a lot of good ideas in various places, but I'm not sure I've seen it unified into one coherent whole in any one language in such a way that it's simply a solved problem for virtually no effort. Every A-list or B-list language I know either has easy concurrency that can still get you deep in trouble (like Go), or "solves" the concurrency problem but at a fairly steep cost to the programmer (like Haskell).
Arguably Pony is the closest I've seen, but that's not even B-list yet, that's an "up and comer".
I've done threads in the past, but for a good while now I've not had to do much thinking about async code thanks to advancements.
I read the GP's post as implying that it is not actually that hard. But maybe they did mean that it has changed over time and gotten much more difficult and they're legit asking when that happened?!#
Imagine this level of simple misunderstanding but applied to reading someone else's threading code!