एक प्रतीक्षा 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;

}
0

2 उत्तर

थिटन सही था। जब मैं अवरुद्ध था तब मैं थ्रेड को मार नहीं सका। शायद ऐसा करने का एक बेहतर तरीका है लेकिन मेरे लिए काम किया गया समाधान थ्रेड पर चलने के बाद झूठ बोलना था।

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
जोड़ा

आप रनथ्रेड को NO में प्रारंभ करते हैं और इसकी तुलना YES से करते हैं। थ्रेड कभी इसके अंदर नहीं पहुंचना चाहिए

while(runthread==YES)

पाश। इसके अलावा, जब धागा काम के लिए इंतजार कर रहा है, तो हत्यारा इसे जगाएगा और रनथ्रेड अपने काम-प्रतीक्षा लूप में रहेगा।

0
जोड़ा
मैंने अपना जवाब तय कर दिया, मैंने रनथ्रेड सेटिंग छोड़ दी थी। मुझे लगता है कि विशेष रूप से मुझे यह जानने की जरूरत है कि प्रतीक्षा थ्रेड को कैसे मारना है
जोड़ा लेखक dubbeat, स्रोत