как отменяется дочерний поток POSIX

// threadA.c
int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;

    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (res != 0) {
        perror("Thread creation failed");
        exit(EXIT_FAILURE);
    }
    sleep(3);
    printf("Canceling thread...\n");
    res = pthread_cancel(a_thread);
    if (res != 0) {
        perror("Thread cancelation failed");
        exit(EXIT_FAILURE);
    }
    printf("Waiting for thread to finish...\n");
    res = pthread_join(a_thread, &thread_result);
    if (res != 0) {
        perror("Thread join failed");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg) {
    int i, res, j;
    res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    if (res != 0) {
        perror("Thread pthread_setcancelstate failed");
        exit(EXIT_FAILURE);
    }
    res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
    if (res != 0) {
        perror("Thread pthread_setcanceltype failed");
        exit(EXIT_FAILURE);
    }
    printf("thread_function is running\n");
    for(i = 0; i < 10; i++) {
        printf("Thread is still running (%d)...\n", i);
        sleep(1);
    }
    pthread_exit(0);
}

Вывод выглядит следующим образом:

$ ./threadA
thread_function is running
Thread is still running (0)...
Thread is still running (1)...
Thread is still running (2)...
Canceling thread...
Waiting for thread to finish...
$

По окончании ожидания в 3 секунды основной поток выдает команду pthread_cancel, чтобы остановить дочерний поток, и дочерний поток действительно начинает ответ отмены после вызова команды pthread_join.

В настоящий момент основной поток переходит к строке сразу после pthread_join, дочерний поток выполняется внутри цикла следующего кода,

    for(i = 0; i < 10; i++) {
        printf("Thread is still running (%d)...\n", i);
        sleep(1);
    }

Я не вижу никаких оператор проверки внутри этого цикла, но основной поток все еще может отменить дочерний поток.Я предполагаю, что многопоточная система POSIX имеет внутреннюю систему проверки, так что она может завершить дочерний поток, когда pthread_join вызывается в основном потоке.

Вопрос>

По сути, мне нужно понять, как дочерний поток может быть отменяется внутри цикла без проверки каких-либо флагов.

Также, пожалуйста, исправьте мое описание, если что-то не так.

5
задан caf 11 July 2011 в 06:59
поделиться