Question: Given that pthread\_spin\_lock is available, when would I use it, and when should one not use them ?

i.e. how would I decide to protect some shared data structure with either a pthread mutex or a pthread spinlock ?

Answer: 
The safest method with a performance boost is a hybrid of the two: an adaptive mutex.

When your system has multiple cores you spin for a few thousand cycles to capture the best case of low or no contention, then defer to a full mutex to yield to other threads for long contended locks.

Both POSIX (`PTHREAD_MUTEX_ADAPTIVE_NP`) and Win32 (`SetCriticalSectionSpinCount`) have adaptive mutexes, many platforms don't have a POSIX spinlock API.
Spinlock has only interest in MP context. It is used to execute pseudo-atomical tasks. In monoprocessor system the principle is the following :

1. Lock the scheduler (if the task deals with interrupts, lock interrupts instead)
2. Do my atomic tack
3. Unlock the scheduler

But in MP systems we have no guaranties that an other core will not execute an other thread that could enter our code section. To prevent this the spin lock has been created, its purpose is to postpone the other cores execution preventing concurrency issue. The critical section becomes :

1. Lock the scheduler
2. SpinLock (prevent entering of other cores)
3. My task
4. SpinUnlock
5. Task Unlock

If the task lock is omitted, during a scheduling, an other thread could try to enter the section an will loop at 100% CPU waiting next scheduling. If this task is an high-priority one, it will produce a deadlock.