Il "normale" int in genere corrisponde alla word nativa dell'architettura*, e, almeno su x86 e derivati, consente lettura e scrittura atomica (a patto che l'intero in questione sia allineato); diverso il discorso per l'incremento, che, salvo casi particolari (istruzioni assembly con prefisso LOCK) non è atomico (prevede un fetch e uno store).

In ogni caso, dato che individualmente lettura e scrittura sono atomiche, puoi usare un semaforo POSIX per evitare che più processi cerchino di aggiornare lo stesso dato contemporaneamente. La lettura invece la puoi lasciare libera, dato che, per un int allineato, non c'è la possibilità di leggere un dato scritto "a mezzo" (cosa che invece si può verificare per altri tipi di dato - in tal caso avresti bisogno di un semaforo "generale", da usare anche solo per la lettura).

---

* in realtà su x86_64/Linux int è un intero a 32 bit anche se l'architettura è a 64 bit, ma va bene lo stesso.