Создает ли usleep точку отмены потока? - PullRequest
2 голосов
/ 15 июля 2010

Согласно руководствам по Linux, только следующие функции являются точками отмены потоков: pthread_join, pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait, sigwait.В моей тестовой программе поток завершается через usleep.Функция потока:

void* ThreadFunction(void* arg)
{
    int n = 0;

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

    for(;;)
    {
        ostringstream s;
        s << "Thread iteration " << n++;
        PrintLine(s.str().c_str());

        usleep(500000);

        PrintLine("Check whether thread canceled...");
        pthread_testcancel();
        PrintLine("Thread is not canceled - continue");
    }

    pthread_exit(NULL);
}

Когда основная функция выполняет pthread_cancel, я ожидаю, что последней строкой, напечатанной ThreadFunction, будет «Проверить, отменен ли поток ...».Тем не менее, он всегда печатает «Итерация потока ...» перед выходом.Это означает, что usleep является точкой отмены.Я думаю, что это правильно - любая функция сна должна быть отменяемой.Но это не написано в документации.

Если закомментированная строка комментария, последняя строка вывода потока - "Проверьте, отменен ли поток ...", как я ожидаю.

Ответы [ 2 ]

9 голосов
/ 15 июля 2010

Полный список точек отмены и дополнительных точек отмены доступен в спецификации POSIX:

http://opengroup.org/onlinepubs/007908775/xsh/threads.html

usleep() является обязательной точкой отмены

0 голосов
/ 29 июля 2014

Я видел дерево вызовов pthread_testcanel в Instrument.app на Mac OS, которое вызывает функцию OSSpinLockLock.

но, похоже, не спит.

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