Как завершить другой поток без задержки?

Рейтинг: 1Ответов: 1Опубликовано: 20.05.2011

Есть поток, который периодически засыпает, просыпается, проверяет значение переменной, и если оно ложно, все повторяется, а если истинно, поток завершается. Выглядит это примерно так:

Cоздание потока:

context->exit = false;
pthread_create(thread, NULL, worker, context);

Завершение потока:

context->exit = true;    
pthread_join(thread, NULL);

Выполнение потока:

void *worker(void *context) {
    while (true) {
        if (context->exit)
            break;

        sleep(timeout);
    }
}

Когда флаг завершения exit устанавливается true, проходит некоторе время прежде, чем поток завершится. Как сделать так, чтобы поток завершился сразу?

Ответы

▲ 3Принят

Как завершить другой поток без задержки?

Первое что приходит в голову - не делать задержку. Надо не делать sleep, а использовать сигнальную переменную.

Выглядеть будет примерно так

void * worker(struct my_ctx *context) {
    pthread_mutex_lock(&context->mylock);
    while (!context->exit) {
        pthread_cond_wait(&context->my_condition, &context->mylock);
    }
    pthread_mutex_unlock(&context->mylock);

    return 0;
}

Тогда убивающий:

context->exit = true;   
pthread_mutex_lock(&context->mylock);
pthread_cond_signal(&context->my_condition);
pthread_mutex_unlock(&context->mylock);
pthread_join(thread, NULL);