Время активации отмены - PullRequest
0 голосов
/ 18 марта 2012

Я хотел отменить поток непосредственно перед выполнением деинициализации процесса, как показано ниже.

rc2 = pthread_attr_init(&attr);
ERR_IF( rc2 != 0 );

rc2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ERR_IF( rc2 != 0 );

rc2 = pthread_create(&destroy_thread, &attr, destroy_expired_sessions, NULL);
ERR_IF( rc2 != 0 );
...
rc2 = pthread_cancel(destroy_thread);
ERR_IF( rc2 != 0 );

usleep(10); // without the sleep here, the real cancellation will be postponed.

rc2 = authSessionListDeInit();
ERR_IF( rc2 != 0 );

...

static void *destroy_expired_sessions(void *t)
{
    int rc2 = 0;

    (void)t;

    pthread_cleanup_push(cleanup_handler, NULL);

    rc2 = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    if (rc2 != 0)
        AUTH_DEBUG5("pthread_setcancelstate(): rc2 == %d\n", rc2);

    rc2 = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    if (rc2 != 0)
        AUTH_DEBUG5("pthread_setcanceltype(): rc2 == %d\n", rc2);

    ... // real work of the thread is done here
}

Проблема в том, что, хотя PTHREAD_CANCEL_ASYNCHRONOUS установлен здесь, реальное удаление потока всегда происходит после authSessionListDeInit(), если я не вызову usleep () между ними.

Насколько я понимаю, отмена должна произойти сразу после отправки запроса на отмену через pthread_cancel (), не так ли?

Еслимое понимание неверно, как убедиться, что поток отменяется до вызова authSessionListDeInit ()?

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Из документов :

Обработка отмены в целевом потоке должна выполняться асинхронно относительно вызывающего потока, возвращаемого из pthread_cancel ().

Таким образом, pthread_cancel может вернуться до того, как произойдет отмена, что означает, что ваше предположение неверно.

Вместо использования pthread_cancel вы можете рассмотреть более популярный и, возможно, более безопасный метод (риск сбоя с pthread_cancel) использования флага отменыи / или условные переменные, сигнализирующие о фактическом завершении функции.

0 голосов
/ 18 марта 2012

Нет, отмена происходит в cancellation points, например. системные вызовы, вызовы libc - посмотрите документацию по функциям (например, accept(), close()) или вы можете посмотреть здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...