为什么线程在延迟模式下不等待取消点?
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,
这个预期是不正确的。
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
来完成。
相反,您需要引入一些通信机制(可能通过套接字)来告诉线程它将自行终止。
为什么我的程序中的线程在到达 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;
}
结果:
I exepected thread will be cancelled when testcancel called,
这个预期是不正确的。
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
来完成。
相反,您需要引入一些通信机制(可能通过套接字)来告诉线程它将自行终止。