gfvalvo:
So, if I have say:
std::atomic<int16_t> _currentValue;
Will a read/modify/write operation be atomic and free from meddling by tasks and interrupts in either core?
_currentValue += 100;
I certainly hope so. Otherwise I have a lot of code to fix 
They seem to be using std::atomics in the ESP-IDF tests, so I have no reason to think their atomic implementation wouldn't work.
As a side note, atomic<int16_t> could be slower than atomic, maybe even requiring a lock.
The default operations on atomics (e.g. operator+=) use the most strict memory ordering (sequentially consistent), which migh not be what you want. It's best to be explicit about the memory order.
gfvalvo:
Also, if an atomic variable is used by by ISR and non-ISR code, does it need to be declared volatile?
volatile std::atomic<int16_t> _currentValue;
No, there's no reason to mark atomics as volatile. Volatile has nothing to do with atomicity, but atomics will prevent incorrect compiler optimizations that volatile was meant to avoid.
Edit: I might be wrong here, let me look it up.
Edit2: looked it up, but couldn't find a definitive answer, although most examples I found did not use volatile for std::atomics shared with ISRs.
You can't use volatile for synchronization in a multicore system, you need atomics.
You might want to be careful that your atomics are lock-free if you're using them inside of an ISR, though.
gfvalvo:
Also, is there such a thing as atomic Fetch / Set where the variable is atomically set before returning its previous value?
std::atomic::exchange()?
gfvalvo:
I suppose the alternative to atomic would be FreeRTOS critical sections. But, I just figured the overhead from using mutexs would be greater.
Yes, critical sections require locks and are significantly slower than atomics.
Pieter