2011-10-27 12 views
0

条件変数を待機している間にスリープするpthreadを持っています。私はそれを実行し続けるために外側whileループでブール値を使用します。私が持っているように見える問題は、スレッドが死んでいないこの変数を変更するときです。 待ちpthreadを強制終了する方法

私は楽器に見ていたし、私はスレッドを開始する場合は、死ぬこと、そして私のスレッド数が2である新しいものを始めることを教えていない私がしたいとき、私は適切にこのスレッドを破壊することができますどのように1

int worktodo=0; 
BOOL runthread=NO; 
pthread_cond_t cond=PTHREAD_COND_INITIALIZER; 
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 


void *threadfunc(void *parm) 

{ 
    int rc; 


    while(runthread==YES) 

    { 
     rc=pthread_mutex_lock(&mutex); 

     while(!worktodo) 

     { 
      printf("thtread blocked\n"); 
      rc=pthread_cond_wait(&cond, &mutex); 

     } 

     printf("thtread awake.... doing work\n"); 

     // doing work 

     worktodo=0; 

     rc=pthread_mutex_unlock(&mutex); 



    } 

    // never reaches here!! 
    pthread_detach(NULL); 


} 



void makeThread() 
{ 

pthread_attr_t attr; 

int    returnVal; 

returnVal = pthread_attr_init(&attr); 
assert(!returnVal); 
runthread=YES; 
returnVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
assert(!returnVal); 

int  threadError = pthread_create(&str->thread, &attr, &threadfunc, NULL); 

returnVal = pthread_attr_destroy(&attr); 
assert(!returnVal); 
if (threadError != 0) 
{ 
    // Report an error. 
} 



} 

void wakethread() 
{ 

    pthread_mutex_lock(&mutex); 

    worktodo=1; 
    pthread_cond_signal(&cond); 

    pthread_mutex_unlock(&mutex); 

} 

void killthread 

{ 
    runthread=NO; 

} 

答えて

1

thitonが正しいです。それがブロックされている間、私はスレッドを殺すことができませんでした。 Theresはおそらくこれを行う良い方法ですが、私のために働く解決策は、スレッドをfalseに設定してからスレッドを起動させることでした。

void killthread 

{ 
    runthread=NO; 

    pthread_mutex_lock(&mutex); 

    worktodo=1; 
    pthread_cond_signal(&cond); 

    pthread_mutex_unlock(&mutex); 


} 
0

runthreadをNOに初期化し、YESと比較します。スレッドは、その内部に決して到達してはならない。

while(runthread==YES) 

ループ。また、スレッドが作業を待つとき、killthreadは起動せず、ランスレッドは作業待ちループに留まります。

+0

私は答えを固定しましたが、私はランスドッグを外しました。私は具体的には、私は待っているスレッドを殺す方法を知る必要があると思う – dubbeat

関連する問題