在C语言中,终止正在运行的子线程有两种常用方法:一种是让线程函数正常返回;另一种是使用pthread_cancel函数强制终止线程。我们来分别介绍这两种方法的具体实现。
方法一
让子线程函数正常返回,从而终止子线程的执行。这种方式需要在线程函数中判断是否需要退出,并在需要退出时,将线程函数的返回值设为0。线程启动时,使用pthread_create函数创建线程,并将线程ID存储在一个全局变量中,以便在需要终止线程时调用pthread_cancel函数。
下面是一个示例代码,使用while循环不断执行某些任务,在接收信号后退出线程:
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
pthread_t tid;
void signal_handler(int sig) {
if (sig == SIGINT) {
printf("SIGINT received, canceling thread...\n");
pthread_cancel(tid);
}
}
void *thread_func(void *arg) {
int count = 0;
while (1) {
printf("Task %d is running...\n", count++);
sleep(1);
}
return NULL; // 线程函数返回值为NULL,表示正常退出
}
int main() {
signal(SIGINT, signal_handler);
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL); //等待线程结束,这行就是可有可无的,其实加上这行,只是为了好看
return 0;
}
不断输出任务,并在接收信号后退出线程,注意:有一个重要的点,在主线程中需要调用pthread_join函数,等待子线程结束,这样才能使子线程占用的资源被正确释放。如果不等待子线程结束而直接返回,子线程就会成为“僵尸线程”,占用系统资源。
方法二
使用pthread_cancel函数强制终止子线程的执行。pthread_cancel函数调用后,线程会收到一个取消请求,可以使用pthread_setcancelstate函数在线程函数中判断是否接收到了取消请求,并进行相应的处理。
下面是一个示例代码,使用while循环不断执行某些任务,在接收信号后强制终止线程:
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
pthread_t tid;
void signal_handler(int sig) {
if (sig == SIGINT) {
printf("SIGINT received, canceling thread...\n");
pthread_cancel(tid);
}
}
void *thread_func(void *arg) {
int cancel_state;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); // 允许取消
while (1) {
pthread_testcancel(); // 检查是否接收到取消请求,如果是则终止线程
printf("Task is running...\n");
sleep(1);
}
return NULL;
}
int main() {
signal(SIGINT, signal_handler);
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL); // 等待线程结束
return 0;
}
每次任务执行完成后,调用pthread_testcancel函数检查线程是否收到了取消请求。如果收到了,则线程通知取消,线程函数就会返回NULL。需要注意的是,即使线程通过pthread_testcancel函数检查取消请求时,没有收到取消请求,函数也会立刻返回。
参考文献:
- Linux系统编程
- POSIX多线程编程指南
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言如何正确的终止正在运行的子线程 - Python技术站