So your right,
At the moment the AudioProcessorParameter class does not explcity handle atmoics/thread safety for you yet as far as I'm aware.
But notce that AudioProcessorParameter::setValue(floar newValue) and AudioProcessorParameter::getValue() are pure virtual methods which you need to override.
So you should create a subclass of AudioProcessorParameter and override these methods to use atomic load and store operations.
i.e. your header would look something like below
//Simplified/Incomplete implementation for illustration
class CustomAudioParameter : public AudioProcessorParameter
float getValue() const override;
void setValue(float newValue) override;
and you .cpp / implementation
float CustomAudioParameter::getValue() const
void CustomAudioParamter::setValue(float newValue)
Hopefully that gives you a quick idea of how to subclass AudioProcessorParameter and override the necessary methods to use atomics for thread safety. Apologies for any mistakes above, literally threw this together quickly whilst eating lunch at my desk. I'll try to post up an answer to your second question later on if possible.
p.s check this link with a pdf of the slides for Timur's original cppcon talk on threading:
Just as an extra by widget Timur means any non fundamental type i.e. a user defined class or struct for example. These can be a little tricker to pass around between threads so atmoic pointer techniques are used. To pass over a buffer/stream of audio data from the audio thread to the gui thread you probably want to go for a lock free fifo structure (explained in Timur's cpp con talk i believe).