Все описано в документации
https://www.sqlite.org/whentouse.html
По идее на малых нагрузках он должен отрабатывать нормально, но пишут во первых о возможных тормозах, и о возможном разрушении бд.
Ультимативный путь это поставить бд клиент серверную и переписать программу.
Менее ультимативный это создать lock файл и перед изменением данных проверять блокировку. Файл просто 0 длины.
FILE* f = fopen("myfile.txt", "w");
int result = flock(fileno(f)), LOCK_EX);
// . . . .
// Locked file in use
// . . . .
int release = flock(f, LOCK_UN); // Unlock the file . . .