Cum de a ucide o pthread de așteptare

Aveți un pthread care doarme în timp ce așteaptă o variabilă condiție. Eu folosesc un boolean în buclă exterioară în timp ce îl păstrez să ruleze. Problema pe care mi se pare că o am este atunci când schimba această variabilă firul nu moare.

Am aruncat o privire asupra instrumentelor și dacă încep un fir, spuneți-i să moară, apoi începeți una nouă, numărarea firului meu este 2 și nu 1.

Cum pot distruge corect acest thread când vreau?

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;

}
0

2 răspunsuri

thiton a fost corect. Nu puteam ucide firul în timp ce era blocat. Probabil că este o modalitate mai bună de a face acest lucru, dar soluția care a funcționat pentru mine a fost de a seta runthread la fals, apoi trezi firul.

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
adăugat

Inițializați runthread la NO și comparați-l cu DA. Firul nu trebuie să ajungă niciodată în interiorul acestuia

while(runthread==YES)

buclă. În plus, atunci când firul așteaptă de lucru, killthread nu-l va trezi și runthread va rămâne în bucla de lucru-așteptare.

0
adăugat
Am fixat răspunsul meu, l-am lăsat afară, așezându-mă în râu. Cred că trebuie să știu cum să omor un fir de așteptare
adăugat autor dubbeat, sursa