How a POSIX child stream is canceled

// 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);
}

The output is as follows:

$ ./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...
$

When the wait completes for 3 seconds, the main thread issues the pthread_cancel command to stop the child thread, and the child thread actually begins to respond to cancel after the pthread_join command is called.

Currently, the main thread runs in the line immediately after pthread_join, the child thread starts inside the loop of the following code,

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

I do not see any checks inside this loop, but the main thread can still cancel the child thread. I assume the POSIX multi-threaded system has an internal validation system so that it can terminate the child thread when pthread_join is called in the main thread.

Questions>

Basically, I need to understand how a child thread can be undone inside a loop without checking any flags.

, , , - .

+5
2

, , sleep (, , , printf ).

, , :

if (thread_local_cancellation_flag) {
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE);
    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED);
    pthread_exit(PTHREAD_CANCELED);
}

, , , , "" "" - (, ), . , - , , , . glibc, , , , . :

http://sourceware.org/bugzilla/show_bug.cgi?id=12683

, , , ( ), sleep, , , , .

+6

pthread_cancel . . , . Linux, , , /. , , . , , , , - . , . sleep (), . . pthreads (7).

+3

All Articles