Второй поток будет читать символы только после того, как sem_wait возвратился, сигнализируя, что sem_post был вызван где-то, так что я думаю, что все в порядке.
Что касается fgets и функции подсчета, эти два могут работать одновременно.
Я бы рекомендовал блокировку мьютекса в переменной work_area в этом случае, потому что, если пользователь редактирует переменную в одном потоке, в то время как она читается в другом потоке, возникнут проблемы.
Вы можете использовать мьютекс или семафор и установить для него начальный счет 1.
Если вы реализуете мьютекс или используете подобный семафор, обязательно ставьте mutex_lock после sema_wait, иначе может произойти тупик.