Bekleyen bir pthread'i nasıl öldürürüm

Koşul değişkenini beklerken uyuyan bir pthread var. Çalışırken tutmak için döngüde bir boole kullanın. Sahip olduğum problem, bu değişkeni değiştirdiğimde ipliğin ölmediğidir.

Enstrümanlara baktım ve eğer bir iş parçacığı başlatırsam ölüme söyle, sonra yeni bir tane başlat, iş parçacığı sayısı 2 değil 1.

İstediğimde bu iş parçacığını doğru şekilde nasıl yok edebilirim?

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 cevap

Thiton doğruydu. Engellendiğinde ipliği öldüremedim. Muhtemelen bunu yapmanın daha iyi bir yolu var ama benim için işe yarayan çözüm, aldatmacayı yanlış yere ayarladıktan sonra ipliği uyandırmaktı.

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
katma

Runthread'i NO olarak başlatır ve YES ile karşılaştırırsınız. İplik asla iç kısmına ulaşmamalıdır.

while(runthread==YES)

döngü. Ayrıca, iş parçacığı iş için beklediğinde, killthread onu uyandırmayacak ve runthread iş-bekleme döngüsünde kalacaktır.

0
katma
Cevabımı düzelttim, runthread ayarını dışarıda bıraktım. Sanırım özellikle beklemekte olan bir ipliği nasıl öldüreceğimi bilmem gerekiyor.
katma yazar dubbeat, kaynak