CN106250108B - 一种线程中挂时控的方法 - Google Patents
一种线程中挂时控的方法 Download PDFInfo
- Publication number
- CN106250108B CN106250108B CN201610565820.4A CN201610565820A CN106250108B CN 106250108 B CN106250108 B CN 106250108B CN 201610565820 A CN201610565820 A CN 201610565820A CN 106250108 B CN106250108 B CN 106250108B
- Authority
- CN
- China
- Prior art keywords
- time control
- message
- thread
- attribute
- queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明提出了一种线程中挂时控的方法。首先创建进程时控队列,挂时控函数,及进程的时控响应函数;其次创建子线程及与主线程进行交互的消息链表,子线程中屏蔽掉时控信号,需要挂时控时,直接调用挂时控函数挂时控;第三,主线程响应时到信号执行进程时控响应函数,将线程时控属性转换为时控消息加入到对应线程的消息链表中;最后线程取出时控消息,得到时控属性,根据时控属性进行相应的时控处理。
Description
技术领域
本发明涉及一种挂时控(设置定时器)的方法,特别是一种线程中挂时控的方法。
背景技术
现阶段,多线程技术广泛应用在软件开发中,如果在线程中需要进行时控(或定时器)处理,目前基本上是使用sleep类似的阻塞定时方式,但在这种阻塞方式下,线程处于阻塞状态,不能处理其他消息或事务,弊端非常明显。如果直接像进程那样挂时控,对线程来说是无法确保一定能响应到时到信号(linux下一般使用SIGALRM信号)的,而且在线程中响应这些时到信号将会带来不可预估的后果,因此目前一直未有一种有效的在线程中以非阻塞方式挂时控的方法。
发明内容
发明目的:本发明所要解决的技术问题(或目的)是在线程中以非阻塞方式挂时控并能响应处理时控的方法。
技术方案:本发明提出了一种在线程中以非阻塞方式挂时控并能响应时控处理的方法。该方法主要包括以下步骤:
步骤1,创建进程的时控队列timerList、挂时控函数setTimer_Thread以及时控响应函数timerFunction;进程由线程组成,如果是多线程,一般把线程分为主线程(有时代表进程)和子线程(或者叫次线程);
步骤2,创建子线程及与主线程进行交互的消息链表,屏蔽掉子线程中时控信号,需要挂时控时,直接调用挂时控函数setTimer_Thread挂时控;
步骤3,主线程响应时到信号,并执行时控响应函数timerFunction,将线程时控属性转换为时控消息加入到对应线程的消息链表中;
步骤4,子线程取出时控消息,得到时控属性,根据时控属性进行相应的时控处理。
步骤1中,所述时控队列timerList用于存储整个进程所有线程的时控;时控队列timerList中的每个时控项包含两个时控属性,分别为时控属性一和时控属性二,时控属性一用于指示线程ID,时控属性二用于指示时间属性ID;时控队列timerList中,各时控项按时控时到先后顺序依次排列;
挂时控函数setTimer_Thread包含四个参数:时控属性一、时控属性二、时控标识和时间值,其中,时控标识用于指示是挂时控还是删除时控,时间值是指时控的相对于挂时控时的时间值;
时控响应函数timerFunction为进程的时控响应函数,所有时到响应都首先执行此函数。
步骤1中所述挂时控函数setTimer_Thread执行如下步骤:
步骤1-1,根据时控属性一与时控属性二生成Hash关键字;
步骤1-2,判定时控标识,如果为挂时控,则转到步骤1-3,如果是取消时控则转到步骤1-6;
步骤1-3,根据Hash关键字找到时控项的存储位置,存储时控项;
步骤1-4,根据时控的时到顺序,在时控队列timerList中找到对应的位置,插入该时控;
步骤1-5,如果该时控处于时控队列timerList队首,则调用系统函数setitimer重挂进程的时控;
步骤1-6,根据Hash关键字,找到该时控的存储位置及在时控队列中的位置;
步骤1-7,从时控队列timerList中删除该时控;
步骤1-8,如果该时控处于时控队列timerList队首,则调用系统函数setitimer根据时控队列timerList新队首的时控项重挂进程的时控。
步骤2中,所述子线程与主线程进行交互的消息链表项包含三部分:消息长度、消息属性标识和消息内容,消息长度指消息的字节数;消息属性标识用于指示该消息是普通消息还是时控消息;消息内容即消息的详细内容,如果消息属性标识为1,则其前两个字节存储的是时控属性二。如果不为1,则存储的为消息的详细内容(字节串),消息长度指示了字节串中的字节数(前两个字节就是消息字节串的前两个字节)。
步骤2中,每个子线程对应一个消息链表,主线程或子线程访问该消息链表时,利用线程锁进行加锁,访问结束解锁。线程中屏蔽掉时控信号,是为了只有主线程才能响应时控信号。线程中挂时控直接调用setTimer_Thread,其本质是线程把时控插入到进程的时控队列中,某一时刻在进程中实际上只有时控队列队首的时控在执行。
步骤3中,所述主线程响应时到信号,并执行时控响应函数timerFunction,包括如下步骤:
步骤3-1,从时控队列timerList队首取出一个时控项,并调整其下一个时控的前向指针;
步骤3-2,判定时控项的时控属性一,如果为0,转向步骤3-3;如果为1,则转向步骤3-4;
步骤3-3,主线程根据时控属性二进行相应的时控处理(时控处理是根据实际需要定义的,譬如应用每隔五分钟检查文件大小,达到1MB就转存,那么五分钟时控到了,时控处理就是检查文件大小,如果达到1MB就转存),然后转向步骤3-8;
步骤3-4,根据时控属性一找到对应线程ID的子线程,把时控属性二封装成时控消息;
步骤3-5,对该对应线程的消息链表加锁;
步骤3-6,若该消息链表为空,直接插入时控消息;若不为空,则从头开始查找到第一个消息属性标识msgFlag为0的项,即第一个普通消息,在其前面插入时控消息;
步骤3-7,对该消息链表解锁,并通知该子线程;
步骤3-8,根据时控队列timerList队首的时控项,调用系统函数setitimer重新挂进程的时控。
步骤4包括如下步骤:
步骤4-1,屏蔽SIGALRM信号,确保线程不会响应进程的信号;
步骤4-2,对消息链表加锁;
步骤4-3,依次取出消息链表中的消息,存入线程的局部链表中;
步骤4-4,对消息链表解锁;
步骤4-5,从线程的局部链表中逐一取出消息处理;
步骤4-6,判定消息属性标识msgFlag,如果为普通消息,转到步骤4-7,如果为时控消息,则转到步骤4-8;
步骤4-7,对该普通消息进行处理,返回到步骤4-2;
步骤4-8,从该时控消息中提取时控属性二,进行对应的时控处理;
步骤4-9,返回到步骤4-2。
本发明采用了独特的在线程中挂时控(本质为将线程时控插入到进程的时控队列中),由主线程实际挂时控并响应时控信号,再将线程的时控属性转换为线程时控消息传递给线程,线程从时控消息中获得时控属性并进行相应时控处理的方法,最终实现了在线程中以非阻塞方式挂时控并响应时控处理。
有益效果:本发明采用了独特的在线程中挂时控(本质为将时控插入到进程的时控队列中),由主线程实际挂时控并响应时控信号,再将线程的时控属性转换为线程时控消息传递给线程,线程从时控消息中获得时控属性并进行相应时控处理的方法,最终实现了在线程中以非阻塞方式挂时控并响应时控处理。本发明实现原理简单可靠,通过工程实践证明,本发明是一种有效的在线程中以非阻塞方式挂时控的方法。
下面结合附图对本发明作进一步详细描述。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
图1本发明的setTimer_Thread实现流程图。
图2本发明的timerFunction实现流程图。
图3本发明的子线程执行流程图。
具体实施方式
下面结合附图对本发明作具体说明。应该指出,所描述的实施例仅是为了说明的目的,而不是对本发明范围的限制。
结合图1—图3,本发明包括以下处理步骤:
步骤1,创建进程的时控队列timerList,挂时控函数setTimer_Thread,及时控响应函数timerFunction。
其中时控队列timerList中的每个时控项包含两个时控属性,时控属性一用来指示线程ID,时控属性二指示时间属性ID;timerList中,各时控项按时控时到先后顺序依次排列。
时控队列timerList中存储的详细数据信息如下表1:
表1
名称 | 类型 | 备注 |
Attr1 | Unsigned short | 时控属性一,为线程ID,其中0表示主线程 |
Attr2 | Unsigned short | 时控属性二,时间属性ID |
timerFlag | Unsigned char | 时控标识,0-相对时控,1-绝对时控 |
Xt | Double | 相对时控值,距离当前时间的秒数 |
Jt | Double | 绝对时控值,距离1970年1月1日0点的秒数 |
Prior | 指针 | 前向指针 |
Next | 指针 | 后向指针 |
挂时控函数setTimer_Thread包含四个参数:时控属性一,时控属性二,时控标识,时间值,其处理步骤如下(参见图1本发明的挂时控函数setTimer_Thread实现流程图):步骤1-1,根据时控属性一与时控属性二生成Hash关键字;
步骤1-2,判定时控标识,如果为挂时控,则转到步骤1-3,如果是取消时控则转到步骤1-6;
步骤1-3,根据Hash关键字找到时控项的存储位置,存储时控项;
步骤1-4,根据时控的时到顺序,在时控队列timerList中找到对应的位置,插入该时控;
步骤1-5,如果该时控处于时控队列timerList队首,则调用系统函数setitimer重挂进程的时控;
步骤1-6,根据Hash关键字,找到该时控的存储位置及在时控队列中的位置;
步骤1-7,从时控队列timerList中删除该时控;
步骤1-8,如果该时控处于时控队列timerList队首,则调用系统函数setitimer根据时控队列timerList新队首的时控项重挂进程的时控。
步骤2,创建子线程及其与主线程进行交互的消息链表,子线程中屏蔽掉时控信号,循环执行,需要挂时控时,直接调用setTimer_Thread挂时控。
步骤2中,所述子线程与主线程进行交互的消息链表项包含三部分:消息长度、消息属性标识和消息内容,消息长度指消息的字节数;消息属性标识用于指示该消息是普通消息还是时控消息;消息内容即消息的详细内容,如果消息属性标识为1,则其前两个字节存储的是时控属性二。如果不为1,则存储的为消息的详细内容(字节串),消息长度指示了字节串中的字节数(前两个字节就是消息字节串的前两个字节)。
消息链表项的详细数据信息如下表2:
表2
步骤3,时控到时,主线程响应时到信号执行时控响应函数timerFunction,其处理步骤如下(参见图2本发明的timerFunction实现流程图):
步骤3-1,从时控队列timerList队首取出一个时控项,并调整其下一个时控的前向指针;
步骤3-2,判定时控项的时控属性一,如果为0,转向步骤3-3;如果为1,则转向步骤3-4;
步骤3-3,主线程根据时控属性二进行相应的时控处理,然后转向步骤3-8;
步骤3-4,根据时控属性一找到对应线程ID的子线程,把时控属性二封装成时控消息;
步骤3-5,对该对应线程的消息链表加锁;
步骤3-6,若该消息链表为空,直接插入时控消息;若不为空,则从头开始查找到第一个消息属性标识msgFlag为0的项,即第一个普通消息,在其前面插入时控消息;
步骤3-7,对该消息链表解锁,并通知该子线程;
步骤3-8,根据时控队列timerList队首的时控项,调用系统函数setitimer重新挂进程的时控。
步骤4,子线程取出时控消息进行时控处理,子线程运行处理步骤如下(参见图3本发明的子线程执行流程图):
步骤4-1,屏蔽SIGALRM信号,确保线程不会响应进程的信号;
步骤4-2,对消息链表加锁;
步骤4-3,依次取出消息链表中的消息,存入线程的局部链表中;
步骤4-4,对消息链表解锁;
步骤4-5,从线程的局部链表中逐一取出消息处理;
步骤4-6,判定消息属性标识msgFlag,如果为普通消息,转到步骤4-7,如果为时控消息,则转到步骤4-8;
步骤4-7,对该普通消息进行处理,返回到步骤4-2;
步骤4-8,从该时控消息中提取时控属性二,进行对应的时控处理;
步骤4-9,返回到步骤4-2。
步骤3、步骤4中,所有的时控时到时,首先由进程的timerFunction进行响应,该响应函数将根据时控属性一找到对应线程,将时控属性二转换为时控消息插入到该线程的消息链表中,而线程从消息链表中取出时控消息,根据时控消息中的时控属性Attr2,最终实现对应时控的处理。
本发明提供了一种线程中挂时控的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
Claims (7)
1.一种线程中挂时控的方法,其特征在于,包括以下步骤:
步骤1,创建进程的时控队列timerList、挂时控函数setTimer_Thread以及时控响应函数timerFunction;
步骤2,创建子线程及与主线程进行交互的消息链表,屏蔽掉子线程中时控信号,需要挂时控时,直接调用挂时控函数setTimer_Thread挂时控;
步骤3,主线程响应时到信号,并执行时控响应函数timerFunction,将线程时控属性转换为时控消息加入到对应线程的消息链表中;
步骤4,子线程取出时控消息,得到时控属性,根据时控属性进行相应的时控处理。
2.根据权利要求1所述的方法,其特征在于,步骤1中,所述时控队列timerList用于存储整个进程所有线程的时控;时控队列timerList中的每个时控项包含两个时控属性,分别为时控属性一和时控属性二,时控属性一用于指示线程ID,时控属性二用于指示时间属性ID;时控队列timerList中,各时控项按时控时到先后顺序依次排列;
挂时控函数setTimer_Thread包含四个参数:时控属性一、时控属性二、时控标识和时间值,其中,时控标识用于指示是挂时控还是删除时控,时间值是指时控的相对于挂时控时的时间值;
时控响应函数timerFunction为进程的时控响应函数,所有时到响应都首先执行此函数。
3.根据权利要求2所述的方法,其特征在于,步骤1中所述挂时控函数setTimer_Thread执行如下步骤:
步骤1-1,根据时控属性一与时控属性二生成Hash关键字;
步骤1-2,判定时控标识,如果为挂时控,则转到步骤1-3,如果是取消时控则转到步骤1-6;
步骤1-3,根据Hash关键字找到时控项的存储位置,存储时控项;
步骤1-4,根据时控的时到顺序,在时控队列timerList中找到对应的位置,插入该时控;
步骤1-5,如果该时控处于时控队列timerList队首,则调用系统函数setitimer重挂进程的时控;
步骤1-6,根据Hash关键字,找到该时控的存储位置及在时控队列中的位置;
步骤1-7,从时控队列timerList中删除该时控;
步骤1-8,如果该时控处于时控队列timerList队首,则调用系统函数setitimer根据时控队列timerList新队首的时控项重挂进程的时控。
4.根据权利要求3所述的方法,其特征在于,步骤2中,所述子线程与主线程进行交互的消息链表项包含三部分:消息长度、消息属性标识和消息内容,消息长度指消息的字节数;消息属性标识用于指示该消息是普通消息还是时控消息;消息内容即消息的详细内容,如果消息属性标识为1,则其前两个字节存储的是时控属性二。
5.根据权利要求4所述的方法,其特征在于,步骤2中,每个子线程对应一个消息链表,主线程或子线程访问该消息链表时,利用线程锁进行加锁,访问结束解锁。
6.根据权利要求5所述的方法,其特征在于,步骤3中,所述主线程响应时到信号,并执行时控响应函数timerFunction,包括如下步骤:
步骤3-1,从时控队列timerList队首取出一个时控项,并调整其下一个时控的前向指针;
步骤3-2,判定时控项的时控属性一,如果为0,转向步骤3-3;如果为1,则转向步骤3-4;
步骤3-3,主线程根据时控属性二进行相应的时控处理,然后转向步骤3-8;
步骤3-4,根据时控属性一找到对应线程ID的子线程,把时控属性二封装成时控消息;
步骤3-5,对该对应线程的消息链表加锁;
步骤3-6,若该消息链表为空,直接插入时控消息;若不为空,则从头开始查找到第一个消息属性标识msgFlag为0的项,即第一个普通消息,在其前面插入时控消息;
步骤3-7,对该消息链表解锁,并通知该子线程;
步骤3-8,根据时控队列timerList队首的时控项,调用系统函数setitimer重新挂进程的时控。
7.根据权利要求6所述的方法,其特征在于,步骤4包括如下步骤:
步骤4-1,屏蔽SIGALRM信号,确保线程不会响应进程的信号;
步骤4-2,对消息链表加锁;
步骤4-3,依次取出消息链表中的消息,存入线程的局部链表中;
步骤4-4,对消息链表解锁;
步骤4-5,从线程的局部链表中逐一取出消息处理;
步骤4-6,判定消息属性标识msgFlag,如果为普通消息,转到步骤4-7,如果为时控消息,则转到步骤4-8;
步骤4-7,对该普通消息进行处理,返回到步骤4-2;
步骤4-8,从该时控消息中提取时控属性二,进行对应的时控处理;
步骤4-9,返回到步骤4-2。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610565820.4A CN106250108B (zh) | 2016-07-18 | 2016-07-18 | 一种线程中挂时控的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610565820.4A CN106250108B (zh) | 2016-07-18 | 2016-07-18 | 一种线程中挂时控的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106250108A CN106250108A (zh) | 2016-12-21 |
CN106250108B true CN106250108B (zh) | 2019-05-17 |
Family
ID=57613921
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610565820.4A Active CN106250108B (zh) | 2016-07-18 | 2016-07-18 | 一种线程中挂时控的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106250108B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110598054B (zh) * | 2019-08-19 | 2021-11-23 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019805A (zh) * | 2011-09-20 | 2013-04-03 | 佳都新太科技股份有限公司 | 一种多线程环境下定时器的设置方法 |
CN103324469A (zh) * | 2012-03-21 | 2013-09-25 | 腾讯科技(深圳)有限公司 | 定时器实现方法及装置 |
CN104503761A (zh) * | 2014-12-30 | 2015-04-08 | 浪潮(北京)电子信息产业有限公司 | 一种利用时间转盘处理定时任务的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1605354A1 (en) * | 2004-06-10 | 2005-12-14 | Deutsche Thomson-Brandt Gmbh | Method and apparatus for improved synchronization of a processing unit for multimedia streams in a multithreaded environment |
-
2016
- 2016-07-18 CN CN201610565820.4A patent/CN106250108B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019805A (zh) * | 2011-09-20 | 2013-04-03 | 佳都新太科技股份有限公司 | 一种多线程环境下定时器的设置方法 |
CN103324469A (zh) * | 2012-03-21 | 2013-09-25 | 腾讯科技(深圳)有限公司 | 定时器实现方法及装置 |
CN104503761A (zh) * | 2014-12-30 | 2015-04-08 | 浪潮(北京)电子信息产业有限公司 | 一种利用时间转盘处理定时任务的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106250108A (zh) | 2016-12-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105631359B (zh) | 一种网页操作的控制方法和装置 | |
MX2019004407A (es) | Agentes conversacionales multi-propósito basados en tecnicas de aprendizaje profundo para el procesamiento de consultas de lenguaje natural. | |
GB2579309A (en) | Intrusion detection and mitigation in data processing | |
CN106250108B (zh) | 一种线程中挂时控的方法 | |
CN103761279B (zh) | 一种基于关键词检索的网络爬虫调度方法及系统 | |
CN107194245A (zh) | 一种针对Linux内核页表隔离的功能调用改造方法 | |
CN105743871A (zh) | 一种基于判定树的防火墙策略冲突检测方法 | |
WO2015142948A3 (en) | Methods and systems of preventing an automated routine from passing a challenge-response test | |
RU2016147356A (ru) | Отменяемая защита возможных конфиденциальных элементов данных | |
CN105335245B (zh) | 故障存储方法和装置、故障查找方法和装置 | |
JP2013115781A (ja) | サーバ装置、データ順序保証プログラム、およびデータ順序保証方法 | |
CN102915344A (zh) | 一种sql语句处理方法及装置 | |
CN109218296A (zh) | 基于改进csp策略的xss防御系统和方法 | |
CN104883347A (zh) | 一种网络安全规则冲突分析与简化方法 | |
CN105939308A (zh) | 报文的处理方法和装置 | |
CN107193590A (zh) | 一种基于android的防root方法 | |
CN105988989A (zh) | 一种汉语姓氏的识别方法、装置及服务器 | |
Nakamura et al. | A flexible read-write abortion protocol with sensitivity of objects to prevent illegal information flow | |
Ma et al. | Global analysis and Hopf-bifurcation in a cross-diffusion prey-predator system with fear effect and predator cannibalism | |
CN105447012B (zh) | 一种用于数据库的写入互斥方法及装置 | |
Paolini Paoletti | Masks, interferers, finks, and mimickers: A novel approach | |
CN106302436B (zh) | 一种攻击报文特征的自主发现方法、装置和设备 | |
CN108052587A (zh) | 基于决策树的大数据分析方法 | |
Zhang et al. | Multi-layer modeling of openflow based on efsm | |
CN107770163A (zh) | 一种信息安全管理系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |