LINUX.ORG.RU

вопрос по потокам


0

2

Всем привет, не подскажите что происходит и как ведёт себя код в такой ситуации: есть запрос на завершение потока и следующий фрагмент кода:

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);

    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT);

    usleep(1000*1000);

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);

этот код как бы игнорирует вызов pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT);

и завершается при вызове usleep как и должно было бы быть без pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT); Не подскажите чем вызвано такое поведение? Понятное дело что я чегото не понимаю но по идее на момент выполнения usleep все запросы на завершения игнорируются а после устанавливаются на отсроченный и поток завершается либо на вызове testcancel либо по завершении своей задачи.


Что? Ты, для начала, с пунктуацией разберись, а то такую кашу читать невозможно совсем. Я прочёл два раза и не понял сути проблемы.

Deleted
()
Ответ на: комментарий от Deleted

ну проще показать так: программа написана так:

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);

    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT);

    usleep(1000*1000);

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);
а ведёт себя как эта:
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);

    usleep(1000*1000);

В первом фрагменте я сначала устанавливаю поведение потока при запросе на завершение как отсроченное, но usleep является функцией которая воспринимается как точка завершения а мне нужно чтобы поток работал дальше(на момент вызова usleep запрос на завершение уже есть), поэтому чтобы поток не завершился на usleep я меняю поведение программы строкой pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT); после чего при наличии запроса на завершение и вызове usleep поток не завершается, далее я опять меняю поведение программы на то что было до вызова pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT); Проблема в следующем: если я так делаю то программа ведёт себя как во втором примере кода. Далее, если я напишу вот такой код:

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldS);

    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &OldT);

    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &OldT);

    usleep(1000*1000);
То программа работает до конца и запрос на завершение просто игнорируется

Onito
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.