a_struct.pmem_i; // the type is, wait for it, int* volatile (the pointer is volatile not the object it is pointing to) The second line is a very important point to keep in mind when declaring structs.
You seem to be worried that writing to part of a structure somehow "dirties" the rest so it's no longer thread-safe. That's not how it works, a structure is really just some data laid out contiguously ...