Più che altro dovresti chiarire cosa vuoi ottenere.
Supponendo che:

il thread 1 debba scrivere "aa"
il thread 2 debba scrivere "bb"
il thread 3 debba scrivere "cc"

non hai nessuna garanzia di avere in uscita:
"aabbcc"
ma puoi trovarti con combinazioni tipo:

"ccaabb"
"bbccaa"
etc.

In più le fwrite aggiornano il FILE*, passato come parametro sulla posizione corrente nel file, sulla posizione corrente in scrittura del file. Per cui se non sono aggiornati tutti e tre rischi di trovarti solo:
"aa"
"bb"
"cc"
nel file.

L'unica strada che mi pare percorribile è aprire il file tramite API di sistema passando alla open il flag di possesso esclusivo.
Gli altri thread che cercano di aprire il file devono uscire se non riescono ad aprirlo.
In altre parole il lock dev'essere a livello SO, non utente.
Da questo punto di vista, un file non è diverso da una seriale. Solo un processo/thread può aprire la stessa seriale: gli altri devono fallire.