1、多线程编程-监控线程1、监控线程概述 12、需求 13、示例 14、相关文献 91、监控线程概述不死线程常见于进程中的关键线程,即进程内其它线程的正常运行依赖于该线程,比如在网络编程中,负责与其它模块通信的 socket 线程等。如何保证关键线程始终运行,常用的方法有实现监控线程,当检测到某线程退出时,采取相应的动作,如:重启线程、重启进程、或重启整个系统。本文主要结合前面的基础,讨论如何实现监控线程、重启线程,达到不死的传说。2、需求(1) 利用多线程实现对两个线程(线程 1、线程 2)的监控,保证线程不死;(2) 利用信号量实现线程 1、线程 2 的同步:先启动线程 1,再启动线程 2。3
2、、示例/* 作者: Jeffrey.zhu * 功能: 线程监控示例* 日期: 2010 年 6 月* 联系方式: 墨客论文网: http:/* CSDN 博客:http:/ #include #include #include #include #include #include /* 线程触发标志 */enum PTHREAD_ID_NONE = -1, /* 未知状态 */ PTHREAD_ID_INIT = 0, /* 初始状态触发 */PTHREAD_ID1 = 1, /* 线程 1 触发 */PTHREAD_ID2 = 2, /* 线程 2 触发 */;enum PTHREAD_F
3、LAG_ON = 1, /* 标志打开 */PTHREAD_FLAG_OFF = 0, /* 标志关闭 */;/* 返回结果 */enum ERROR = -1, /* 失败 */OK = 0, /* 成功 */;static int start_pthread_flag = PTHREAD_ID_INIT; /* 触发线程标志 */static int pthread1_exit_flag = PTHREAD_FLAG_ON; /* pthread1 退出标志 */static int pthread2_exit_flag = PTHREAD_FLAG_ON; /* pthread2 退出标
4、志 */* 线程属性及 ID */static pthread_attr_t pthreads_attr; static pthread_t tmp_id = PTHREAD_ID_INIT; static pthread_t pthread1_id = PTHREAD_ID_INIT; static pthread_t pthread2_id = PTHREAD_ID_INIT;/*快速锁,对应于上文的本地全局变量 */static pthread_mutex_t start_pthread_flag_mutex = PTHREAD_MUTEX_INITIALIZER;static pthr
5、ead_mutex_t pthread1_id_mutex = PTHREAD_MUTEX_INITIALIZER;static pthread_mutex_t pthread2_id_mutex = PTHREAD_MUTEX_INITIALIZER;static pthread_mutex_t pthread1_exit_flag_mutex = PTHREAD_MUTEX_INITIALIZER;static pthread_mutex_t pthread2_exit_flag_mutex = PTHREAD_MUTEX_INITIALIZER;static int lock_var;s
6、tatic time_t end_time;static sem_t sem2;/* 接口声明 */static void pthread1(void *arg);static void pthread2(void *arg);static void pthread1_exit(void);static void pthread2_exit(void); static int pthreads_init(void);static void pthreads_deinit(void);/* 作者: Jeffrey.zhu* 功能: 主线程为监控线程* 联系方式: 墨客论文网: http:/* C
7、SDN 博客:http:/ main(int argc, char *argv)int res;end_time = time(NULL) + 30; /* 进程运行时间:30s */res = sem_init( if (0 != res) perror(“sem_init“);while (time(NULL) 10) pthread2_exit();sleep(2);/* 作者: Jeffrey.zhu * 功能: pthread1 线程退出函数* 联系方式: 墨客论文网: http:/* CSDN 博客:http:/ void pthread1_exit(void) pthread_m
8、utex_lock(pthread1_exit_flag = PTHREAD_FLAG_ON;pthread_mutex_unlock(/* kill 掉 pthread2 线程,防止 start_pthread_flag 判断之前的竞争 */if (0 = pthread_equal(pthread2_id, tmp_id) pthread_cancel(pthread2_id);pthread_mutex_lock(pthread2_id = PTHREAD_ID_INIT;pthread_mutex_unlock( pthread_mutex_lock(start_pthread_fla
9、g = PTHREAD_ID1;pthread_mutex_unlock(pthread_mutex_lock(pthread1_id = PTHREAD_ID_INIT;pthread_mutex_unlock(printf(“pthread1 is exit!n“);pthread_exit(NULL);/* 作者: Jeffrey.zhu * 功能: pthread2 线程退出函数* 联系方式: 墨客论文网: http:/* CSDN 博客:http:/ void pthread2_exit(void)pthread_mutex_lock(pthread2_exit_flag = PTH
10、READ_FLAG_ON;pthread_mutex_unlock(/* kill 掉 pthread1 线程 */if (0 = pthread_equal(pthread1_id, tmp_id) pthread_cancel(pthread2_id);pthread_mutex_lock(pthread1_id = PTHREAD_ID_INIT;pthread_mutex_unlock( pthread_mutex_lock(start_pthread_flag = PTHREAD_ID2;pthread_mutex_unlock(pthread_mutex_lock(pthread1
11、_id = PTHREAD_ID_INIT;pthread_mutex_unlock(printf(“pthread2 is exit!n“);pthread_exit(NULL);/* 作者: Jeffrey.zhu * 功能: 初始化函数* 联系方式: 墨客论文网: http:/* CSDN 博客:http:/ int pthreads_init(void)int opt = 1;int res;/* 互斥处理 */res = pthread_mutex_init(if (0 != res) printf(“pthreads_init():MUTEX INIT ERROR, reinitn
12、“);return ERROR;res = pthread_mutex_init(if (0 != res) printf(“pthreads_init():MUTEX INIT ERROR, reinitn“);return ERROR;res = pthread_mutex_init(if (0 != res) printf(“pthreads_init():MUTEX INIT ERROR, reinitn“);return ERROR;res = pthread_mutex_init(if (0 != res) printf(“pthreads_init():MUTEX INIT ER
13、ROR, reinitn“);return ERROR;res = pthread_mutex_init(if (0 != res) printf(“pthreads_init():MUTEX INIT ERROR, reinitn“);return ERROR;/* 线程属性处理 */res = pthread_attr_init(if (0 != res) printf(“pthread_attr_init():PTHREAD ATTR INIT ERROR, reinitn“);return ERROR;res = pthread_attr_setdetachstate(if (0 !=
14、 res) printf(“pthread_attr_setdetachstate():PTHREAD ATTR SET ERROR, reinitn“);return ERROR;return OK;/* 作者: Jeffrey.zhu * 功能: 资源释放函数* 联系方式: 墨客论文网: http:/* CSDN 博客:http:/ void pthreads_deinit(void)pthread_attr_destroy(pthread_mutex_destroy(pthread_mutex_destroy(pthread_mutex_destroy(pthread_mutex_des
15、troy(pthread_mutex_destroy(4、相关文献1、基于信号量的 Linux 多线程同步研究 中文摘要:信号量是进程或线程之间相互通讯的手段之一。有效地使用可以在多线程之间实现同步和互斥,以保证程序的正确的运行。在对线程的数据结构和相关的 10 个函数分析的基础上,以一个具体的例子给出如何使用信号量机制实现多线程之间的同步。摘自墨客论文网:http:/ Winsock 在导弹仿真中的应用 中文摘要:WindowsNT 的多线程能力适合处理并行性任务,在主线程中可以创建多个子线程,每 个子线程可以独立完成一个子任务,一个程序可以同时完成多个任务。使用多线程技术,既加快了系统的反
16、应速度,又提高了执行效率。该文介绍了 WindowsNT 环境下基于 MFC 的多线程编程技术的原理、线程间的通信及同步控制的方法,以及 Winsock 网络编程的原理。最后介绍了在微机局域网 (LAN)下采用多线程和 Winsock 编程技术进行空空导弹分布式实时仿真系统的设计过程。摘自墨客论文网:http:/ Java 线程 中文摘要:多线程程序是 Java 语言的一个很重要的特点。本文针对 Java 平台中线程的性质和应用程序的多线程策略进行了分析和讨论。摘自墨客论文网:http:/ 中文摘要:提出了一种面向小型工业的实时监控数据库解决方案。采用 ADO 技术与多线程技术解决了过 程监控系统中实时数据的存储、管理和处理的问题。利用 Visual C6.0语言编程,在自来水厂的 Ethernet 现场总线设备上对监控数据库进行试验运行 ,其性能稳定、运行可靠。摘自墨客论文网:http:/ Visual C实现工作者线程与主线程间的可靠、安全通讯 摘自墨客论文网:http:/ DLL 的应用 中文摘要:本文介绍了 Windows 环境下的多线程和动态链接库,及在数据采集和处理系统中的应用它们,从而提高系统的实时性和通用性。摘自墨客论文网:http:/ 线程实现机制分析摘自 IBM developerworks:http:/