Как убить ожидание - PullRequest
       6

Как убить ожидание

0 голосов
/ 27 октября 2011

Имейте 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;

}

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Титон был верным.Я не мог убить поток, пока он был заблокирован.Вероятно, есть лучший способ сделать это, но решение, которое мне помогло, состояло в том, чтобы установить для runthread значение false, а затем разбудить поток.

0 голосов
/ 27 октября 2011

Вы инициализируете runthread в NO и сравниваете его с YES.Нить не должна достигать внутренней части своей петли

while(runthread==YES)

.Кроме того, когда поток ожидает работу, killthread не разбудит его, а runthread останется в цикле ожидания работы.

...