de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 dubbeat
dubbeat
Вопрос

Как убить ожидающий pthread

У вас есть 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 2011-10-27T14:41:02+00:00 2
 dubbeat
dubbeat
Редактировал вопрос 27-го октября 2011 в 2:51
Программирование
multithreading
posix
pthreads
dubbeat
27-го октября 2011 в 9:57
2011-10-27T21:57:59+00:00
Дополнительно
Источник
Редактировать
#56789884

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

void killthread

{
  runthread=NO;

  pthread_mutex_lock(&mutex);

    worktodo=1;
    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);


}
1
0
thiton
27-го октября 2011 в 2:50
2011-10-27T14:50:17+00:00
Дополнительно
Источник
Редактировать
#56789883

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

while(runthread==YES)

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

0
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Elena Nudel
Зарегистрирован 1 день назад
2
firdaus faizal
Зарегистрирован 1 день назад
3
Виталий Теслюк
Зарегистрирован 3 дня назад
4
shokir qochqorov
Зарегистрирован 3 дня назад
5
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией