您的位置:首页 > 其它

用signal结束多个线程

2011-05-25 17:57 183 查看
在创建多线程时,有时可能几个线程里面都是死循环,如果结束这些线程呢?可以用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: