Попробуйте закомментировать строку pthread_detach(thread_id);
и запустите ее.Вы создаете поток как отделенный с помощью pthread_attr_t.
Либо так, либо попробуйте передать NULL вместо & attr в pthread_create (чтобы поток не создавался отдельно), и запустите его.
Я бы предположил, что если время выбрано правильно, (уже отсоединенный) поток исчезнет к тому времени, когда основной поток попытается выполнить pthread_detach, и вы перейдете в Never Never Land в pthread_detach.
Редактировать:
Если cout имеет неявную точку отмены, как указывает Габриэль, то, скорее всего, произойдет то, что поток отменяет, удерживая мьютекс (он никогда не доберется до pthreads_unlock_mutex после cout), и таквсе, кто ожидает мьютекс, будут заблокированы навсегда.
Если единственный ресурс, о котором вам нужно беспокоиться, это мьютекс, вы можете отслеживать, заблокирован ли он в вашем потоке, а затем разблокировать его в процессе очистки., предполагая, что очистка выполняется в том же потоке.
Посмотрите здесь, стр. 157 на: PThreads Primer .