2011-06-22 51 views
0

我做了一個包含存儲向量和互斥體的Queue類。 要初始化隊列,需要啓動一個線程。爲了確保線程正確啓動,構造函數等待一個信號。線程函數是Queue類的一個朋友。但是,線程函數發送時信號未被註冊。爲什麼?Pthreads和類

Queue::Queue() 
{ 
    (...) 
    pthread_mutex_init(&mutex_cond_init, NULL); 
    Q_ready = false; 
    (...) 
    pthread_create(&thread_ID, NULL, Queue_function, this); 

    pthread_mutex_lock(&mutex_cond_init); 
    while(!Q_ready) 
    { 
     cout << "waiting" << endl; 
     pthread_cond_wait(&cond_init,&mutex_cond_init); 
     cout << "got signal" << endl; 
    } 
    pthread_mutex_unlock(&mutex_cond_init); 
    cout << "Queue open." <<endl; 
} 


void * Queue_function (void*arg) 
{ 
    (...) 
    Queue * S = (Queue*) arg; 

    pthread_mutex_lock(&(*S).mutex_cond_init); 
    (*S).Q_ready = true; 

    pthread_cond_signal(&(*S).cond_init); 
    pthread_mutex_unlock(&(*S).mutex_cond_init); 
    (...) 
} 

任何幫助,將不勝感激

+0

你初始化了'cond_init'嗎?你的代碼只顯示'mutex_cond_init'的初始化。 –

+2

此外,在釋放其析構函數中的資源的異常安全RAII風格的類中,您將從包裝資源(例如互斥鎖和互斥鎖)中受益匪淺。例如,看看C++ 0x中的boost :: mutex和std :: mutex是如何工作的。 –

+0

那個伎倆,謝謝! – pjaall

回答

0

你初始化cond_init?您的代碼僅顯示mutex_cond_init的初始化。