在创建多线程时,有时可能几个线程里面都是死循环,如果结束这些线程呢?可以用signal(),这里介绍signal的一个应用。 当然,不用signal(),直接按Ctrl+C也可以结束。 // file name:signal_to_stop_thread.c // 接收到特定的信号量,结束多个线程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <pthread.h> //typedef int bool; #define MY_FALSE 0 #define MY_TRUE 1 /** * 信号量部份-开始 */ typedef struct GlobalData { int quit; pthread_mutex_t mutex; }GlobalData; GlobalData gbl; void init_global_data() { pthread_mutex_init(&gbl.mutex,NULL); gbl.quit = MY_FALSE; } void set_global_data() { pthread_mutex_lock(&gbl.mutex); gbl.quit = MY_TRUE; pthread_mutex_unlock(&gbl.mutex); } int get_global_data() { int temp; pthread_mutex_lock(&gbl.mutex); temp = gbl.quit; pthread_mutex_unlock(&gbl.mutex); return temp; } void signalHandler(int sig) { signal(SIGINT,SIG_DFL); set_global_data(); } /** * 多线程部份-开始 */ void thread1(void) { int i = 0; while(!(get_global_data())) { printf("This is a pthread 1111 i = %d./n",i); sleep(1); i++; } printf("stop thread 1/n"); pthread_exit(0); } void thread2(void) { int i = 0; while(!(get_global_data())) { printf("This is a pthread 2222 i = %d./n",i); sleep(1); i++; } printf("stop thread 2/n"); pthread_exit(0); } int main(int argc,char *argv[]) { pthread_t id1,id2; int ret; /* 初始化全局变量 gbl */ init_global_data(); /* 初始化SIGINT信号,也就是当输入Ctrl+C时,程序会执行signalHandler */ signal(SIGINT, signalHandler); /* 创建线程一 */ ret=pthread_create(&id1,NULL,(void *) thread1,NULL); if(ret!=0) { printf ("Create pthread 1 error!/n"); exit (1); } /* 创建线程二 */ ret=pthread_create(&id2,NULL,(void *) thread2,NULL); if(ret!=0) { printf ("Create pthread 1 error!/n"); exit (1); } /* 等待线程结束 */ pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }