Правильнее всего использовать nanosleep, потому что сон и сон могут мешать SIGALARM, в то время как nanosleep был специально разработан с учётом потоков:
struct timespec mytimeout = {
.tv_sec = 5,
.tv_usec = 0,
};
struct timespec remaining;
nanosleep(&mytimeout, &remaining);
Мой оригинальный ответ - использовать трюк выбора, но давайте прекратим продвигать плохой код
Возвращаясь к корню проблемы, откуда вы знаете, что ваша ошибка сегментации возникла из спящего кода?Вы получили дамп ядра, который вы могли бы отследить?