2011-10-27 56 views
0

有一个睡眠等待条件变量的pthread。我在外部while循环中使用布尔值来保持它运行。我似乎遇到的问题是当我更改这个变量时线程不会死。如何杀死一个等待的线程

我接过来一看仪表和如果我启动一个线程,告诉它死了,然后开始一个新的我的线程数是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可能是一个更好的方法来做到这一点,但解决方案是为我设置runthread为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不会唤醒它,并且runthread将保留在其工作等待循环中。

+0

我解决了我的答案,我没有设置runthread。我想具体然后我需要知道如何杀死一个等待线程 – dubbeat