This isn't specifically for C (in fact the examples are mostly in Java) but Herlihy and Shavit's The Art of Multiprocessor Programming was a fantastic resource for me for learning parallel algorithm and data structure design. It does a really good job of walking you through a bunch of examples of how to use and write everything from locked data structures to lock-free and wait-free techniques. You'll just have to seperately look up how to use mutexes or atomic instructions (<stdatomic.h>) in C, but the techniques they go over are fairly language agnostic.
Good grief, do I really have to read all 6? I have a full-time job to do! 😊
The Art of Multiprocessor Programming is a really serious work, and to describe it as for "but anyone who wants to learn basics of concurrent programming" is not to do it justice.
Introduction to Multiprocessor Programming, based on this book.
It was an amazing introduction to concurrent data structures, I've enjoyed every minute.
(Having one of the book's authors teach it helped, too)
This was quite nice during my undergrad. It does a really nice job of exposing concepts while using Java as the tool.
You probably want The Art of Multiprocessor Programming https://www.amazon.com/Art-Multiprocessor-Programming-Revised-Reprint/dp/0123973376
https://www.amazon.ca/Art-Multiprocessor-Programming-Revised-Reprint/dp/0123973376 This is the textbook I used at school, written by very accomplished people in the field. The examples are in Java, but still much more relevant to C++ than Haskell
​
Edit: also saw this in the recommend section https://www.amazon.ca/C-Concurrency-Action-Anthony-Williams/dp/1617294691/ref=pd_sim_14_1/132-4440775-4374661?_encoding=UTF8&pd_rd_i=1617294691&pd_rd_r=5bc163aa-5168-4d44-8d3a-b9172c9214ef&pd_rd_w=0Bj4K&pd_rd_wg=3bt0f&pf_rd_p=c88402a1-fb67-4267-a2e2-9275e5465716&pf_rd_r=5SZPTE6YZMFSBYJTFEKC&psc=1&refRID=5SZPTE6YZMFSBYJTFEKC
This is the only one you need The Art of Multiprocessor Programming, Revised Reprint https://www.amazon.co.uk/dp/0123973376/ref=cm_sw_r_em_apa_i_sbLzFbA681HK3 Caution: this may take some time.
Maybe my answer should be no.
From the Global Interpreter Lock page on Wikipedia:
> [you can] use separate processes to achieve full parallelism
In the article Making Python 3 more attractive, Larry Hastings is said to have talked about another future possibility:
> what would it take to have multiple, simultaneous Python interpreters running in the same process? It would be a weaker form of a multicore Python that would keep the GIL. Objects could not be shared between the interpreter instances.
Or maybe my final answer should be yes.
I just noticed a comment earlier today on #perl6 that hints at that:
"reading/understanding the art of multiprocessor programming has been much easier after having been exposed to the higher level threading stuff in perl6"
Or maybe my answer should be maybe. Compared with, for example, Perl 5.22 and Pythons 2.7 and 3.5, Perl 6 is still buggy and slow, with incomplete doc, etc.