Neviem, podľa ktorého vzoru si to implementoval, ale nemáš to dobre. Vo funkcii dataThread najskôr odomykáš writerMutex a až potom zamykáš readerMutex - to je nesprávne, pretože sa ti môže stať, že medzitým refreshThread nastaví hodnotu writer na true a prečíta hodnotu readers ako rovnú nule.
Ďalšia vec, hoci je to len príklad - vlákna by si mal na konci programu ukončiť trochu slušnejším spôsobom (použiť join). Namiesto trápenia sa s mutexami by som na tvojom mieste použil ten pthread_rwlock_t.