// 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时终止子线程。
问题>
基本上,我需要了解如何在循环中取消子线程而不检查任何标志。
如果有任何错误,请纠正我的描述。
pthread_setcanceltype
和pthread_setcancelstate
不是取消点。除非取消类型为异步,否则仅在取消点处检查取消状态。在这种情况下,它可能会在其他点被检查并异步中断代码(但不是必需的)。 - R.. GitHub STOP HELPING ICE