Hoe een wachtende pthread te doden

Heb een pthread die slaapt tijdens het wachten op een conditievariabele. Ik gebruik een booleaanse waarde in de buitenste while-loop om deze te laten draaien. Het probleem dat ik schijn te hebben is wanneer ik deze variabele verander de draad niet sterft.

Ik nam een ​​kijkje in instrumenten en als ik een draad begin, zeg het dan om dood te gaan, start dan een nieuwe draad en mijn aantal draden is 2 niet 1.

Hoe kan ik deze draad op de juiste manier vernietigen wanneer ik dat wil?

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 antwoord

thiton was correct. Ik kon de draad niet doden terwijl deze was geblokkeerd. Er is waarschijnlijk een betere manier om dit te doen, maar de oplossing die voor mij werkte, was om runthread in te stellen op false en vervolgens de thread te wekken.

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
toegevoegd

U initialiseert runthread in NO en vergelijkt het met YES. De draad mag nooit de binnenkant van de draad bereiken

while(runthread==YES)

lus. Trouwens, wanneer de thread wacht op het werk, zal killthread het niet activeren en zal runread in zijn werk-wachtlus blijven.

0
toegevoegd
Ik loste mijn antwoord op, ik had het instellen van runthread achterwege gelaten. Ik denk dat ik dan specifiek moet weten hoe ik een wachtende draad moet doden
toegevoegd de auteur dubbeat, de bron