C89 says that it's
the integral type of an object that can be accessed as an atomic
entity, even in the presence of asynchronous interrupts.
volatile not specified, probably because qualifiers were a new thing when the first standard was made.
C99 adds "possibly volatile-qualified.
I suppose it's backwards compatibility from then on combined with "nobody cares enough", since signal-handling is a relatively minor part of most project.
Also somebody could presumably use it in a context where volatile is not required (e.g., to store a copy of a flag used for communication with signal handlers) and in non-GNU C (again, backwards compatibility) it's basically impossible to map a type to a less qualified version of that type, which makes an implementation that chooses to omit the qualifier more flexible.
std::atomic
is not recommended for signal handlers because there is a potential risk of deadlock. Also, but less important, the default seq/cst makes it stronger than necessary – Shawnna