收藏 分享(赏)

多线程编程-监控线程.doc

上传人:gnk289057 文档编号:5998318 上传时间:2019-03-23 格式:DOC 页数:10 大小:82.50KB
下载 相关 举报
多线程编程-监控线程.doc_第1页
第1页 / 共10页
多线程编程-监控线程.doc_第2页
第2页 / 共10页
多线程编程-监控线程.doc_第3页
第3页 / 共10页
多线程编程-监控线程.doc_第4页
第4页 / 共10页
多线程编程-监控线程.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

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:/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报