pthread_cond_wait: falha de segmentação aleatória

Atualização 3

Recentemente, notei que meu código causa aleatoriamenteFalha de segmentação erros. Mas eu acho que meu código é bem simples até agora e não consigo descobrir de onde vem esse erro. Como isso acontece aleatoriamente, presumo que exista algum tipo de condição de corrida. Eu acho que esse é todo o código que pode ser relevante, me diga se você precisa de mais:

namespace thread {
    pthread_t terminated_thread_id, /* and others */;
    pthread_mutex_t terminate_thread = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t terminate_thread_signal = PTHREAD_COND_INITIALIZER;
    int total_thread_count = 0;
    int termination; // + sembufs

    inline void* Exit(void* value) {
    //  This must be unlocked after all join-related jobs are done
        semop(thread::termination, thread::termination_in_process, 2)
            pthread_mutex_lock(&thread::terminate_thread);
                thread::terminated_thread_id = pthread_self();
                pthread_cond_signal(&thread::terminate_thread_signal);
            pthread_mutex_unlock(&thread::terminate_thread);

        pthread_exit(value);
        return value;
    }
}
int main(int argc, const char** argv){
...
    pthread_mutex_lock(&thread::terminate_thread);
    if(0 != pthread_create(&thread::communication_handler_thread_id, NULL,    \
                           CommunicationHandler, NULL)){
        global::PrintDebug("pthread_create() failed", __FILE__, __LINE__);
    }
    /** 2 more pthread_create()-calls */       
    do{
        thread::terminated_thread_id = pthread_self();
        pthread_cond_wait(&thread::terminate_thread_signal,                   \
                          &thread::terminate_thread);
        if(!pthread_equal(thread::terminated_thread_id, pthread_self())){
            pthread_join(thread::terminated_thread_id, NULL);
    ...
            semop(thread::termination, thread::termination_done, 1)
        }
    }while(thread::total_thread_count > 0);

    pthread_mutex_unlock(&thread::terminate_thread);
    return 0;
}

O sinalterminate_thread_signal só é emitido nothread :: Exit () função. Essa função também é chamada apenas no final da função usada para criar o encadeamento.

Isso é o que o depurador mostra para a pilha de chamadas:

#0 (    0xb7fe2424 in __kernel_vsyscall() (??:??)
#1 0xb7fbdfcf   __pthread_cond_wait(cond=0x80539c0, mutex=0x8053998) (pthread_cond_wait.c:153)
#2 0x804a094    main(argc=1, argv=0xbffff9c4) (/home/papergay/SeekYourCar/0.2/Server/main.cpp:121)

O que eu já sei é, se o erro acontecer, então nenhum thread chamou thread :: Exit () ainda. Eu também estou usando um namespace sem nome com algumas inicializações (se isso pode ser relevante). Eu estou usando Code :: Blocks como IDE e GCC como compilador.

questionAnswers(3)

yourAnswerToTheQuestion