为什么线程在延迟模式下不等待取消点?

Why is the thread not waiting for the cancellation point in deferred mode?

为什么我的程序中的线程在到达 testcancel 函数之前就取消了?我预计线程会在调用 testcancel 时被取消,但它会立即取消并更改取消状态以启用。

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int i = 0;

void proc1()
{
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
    for (i = 0; i < 7; i++)
    {    
        if (i == 3) {
            pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
            pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
        }
        if (i == 5) {
            pthread_testcancel();
        }
        printf("I'm still running! %d\n", i);
    sleep(1);
    }
}

int main(void)
{
    pthread_t thread;
    pthread_create(&thread, NULL, (void*)proc1, NULL);
    sleep(1);
    printf("Requested to cancel the thread\n");
    pthread_cancel(thread);
    pthread_join(thread, NULL);
    printf("The thread is stopped\n");
    return 0;
}

结果:

我试过 运行 它没有 printf(因为 printf 也是取消点)但它没有解决问题。

I exepected thread will be cancelled when testcancel called,

这个预期是不正确的。

来自phread_cancel spec

Deferred cancelability means that cancellation will be delayed until the thread next calls a function that is a cancellation point.

还有一个 link 用于检查 cancellation point 是什么:

The following functions are required to be cancellation points by POSIX.1-2001 and/or POSIX.1-2008:

 ...
 pthread_testcancel()
 ...
 sleep()
 ...

它们中的每一个都会使您的线程响应取消。

这意味着,这个假设也不完全正确:

but it cancelling immediately with a changing cancelstate to enable.

相反,您的线程在将取消状态设置为启用时在同一迭代中调用 sleep 后立即被取消。 (顺便说一句:默认情况下取消类型是延迟的)

你似乎期望线程在主动查询取消状态时只检查它是否被取消。我不认为这可以使用 pthread_cancel 来完成。 相反,您需要引入一些通信机制(可能通过套接字)来告诉线程它将自行终止。