用signal结束多个线程
2011-05-25 17:57
183 查看
在创建多线程时,有时可能几个线程里面都是死循环,如果结束这些线程呢?可以用signal(),这里介绍signal的一个应用。
当然,不用signal(),直接按Ctrl+C也可以结束。
当然,不用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; }
相关文章推荐
- c# winform 关闭窗体时同时结束线程实现思路
- android 如何结束一个线程?
- 线程没有正常结束产生的内存泄露问题的解决
- java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程
- 能够随时结束线程的办法
- 如何结束阻塞状态的线程
- 如何结束线程运行
- Java实现等待所有子线程结束后再执行一段代码的方法
- iOS监听线程结束
- Linux 2. 关于pthread_cond_signal 唤醒两个线程的问题
- Python结束线程的方法
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- 线程结束
- 用事件判定线程的结束与否
- Android线程结束——合理的结束你想结束的线程
- Java结束线程的三种方法
- Qt的线程和 signal-slot
- Junit测试含有‘启动新线程’这一操作的方法时瞬间结束的问题
- vc 结束线程
- java并发(一) CountDownLatch (在多个线程都结束后再去执行某个任务)