I am trying to design a linked list in c++ that allows concurrent access. Clearly using a single lock for this list is grossly inefficient since disjoint areas may be updated in
There are lots of different ways you could go about this, depending on how you're going to use the list.
First, for a list, a single mutex lock is not necessarily a big deal because lists can support splicing. Say you have a list of chars AF and another list BCDE. You don't have to lock the mutex, insert B, lock it again, insert C, etc. You can insert BCDE all at once between A and F by setting A's next pointer to B and E's next pointer to F, forming ABCDEF. No matter how many elements you want to insert at once you only need one lock. This is true even for a doubly linked list. So it might not be a bottleneck in your application.
Assuming that it would be a bottleneck though, you need to consider whether you're going to have one or multiple writers and one or multiple readers.
Assuming you have a single writer and multiple readers, you can avoid mutex locks entirely by using atomic instructions, assuming they're available for your architecture. In GCC these are available through the builtin __sync_* functions and in Visual C++ they're available via Interlocked*, but if you're stuck with a compiler that lacks direct support for them you can still use them via inline assembly. The writer will use the atomic instructions to atomically set next pointers to patch elements in and out of the list.
Hopefully that gets you started. To get a deep answer I'd suggest asking another question and including: