一种基于信号的线程间通信方法技术

技术编号:36508762 阅读:17 留言:0更新日期:2023-02-01 15:35
本发明专利技术公开的基于信号的线程间通信方法,包括:创建双向循环链表;启动线程,将线程信息的数据结构插入到所述双向循环链表中对应线程节点的数据域;获取双向循环链表中任一发起线程向另一目标线程的数据发送请求;查询所述目标线程中数据域的数据锁结构,若数据锁结构为非锁定状态,将目标线程的数据锁结构调整为锁定状态,调用发送函数将要传递的数据发送至目标线程并存储至目标线程中数据域的数据存储结构;目标线程持续查询自身数据源的数据存储结构,通过调用查询函数返回新的传递数据。本发明专利技术线程间直接通过发送信号来通信,信号里可以携带自定义数据,灵活性和适用性很强。灵活性和适用性很强。灵活性和适用性很强。

【技术实现步骤摘要】
一种基于信号的线程间通信方法


[0001]本专利技术涉及系统线程间通信
,具体涉及一种基于信号的线程间通信方法。

技术介绍

[0002]目前linux系统中的进程间通信方法有很多,包括管道、信号、套接字、共享内存等,而线程间的通信手段主要是用于线程同步,包括互斥锁、读写锁、条件变量、自旋锁、信号量机制等。
[0003]线程通信没有像进程通信中用于数据交换的通信机制。简单的线程间数据交换可以使用加锁的全局变量,但全局变量的过度使用会破坏程序的结构,造成代码难以维护。
[0004]CN 102867018 A 提出了一种数据库系统中线程间的模拟信号通信方法,该方法在实施上存在一定的复杂性,需要创建一个通信管理中心,同时线程的映射关系与指针混合使用会降低程序鲁棒性,对使用者造成困惑。
[0005]公开号为CN 109697131 A的专利技术专利“进程间参数管理、同步方法及装置”,该方法涉及一种进程间参数管理、同步方法及装置,但不适应线程间通信的情况。公开号为CN1273910C的专利技术专利“总线式进程间通信方法”也存在同样的问题,不适用线程间通信。

技术实现思路

[0006]专利技术目的:本专利技术目的在于针对现有技术的不足,提供一种基于信号的线程间通信方法,线程间可以直接通过发送信号来通信,信号里可以携带自定义数据,灵活性和适用性很强。
[0007]技术方案:本专利技术所述基于信号的线程间通信方法,包括如下步骤:S1:创建双向循环链表;S2:启动线程,将线程信息的数据结构插入到所述双向循环链表中对应线程节点的数据域;S3:发送方线程调用信号发送函数向目标线程请求发送数据,调用信号发送函数时,发送方线程将目标线程的名字和待传递的数据作为函数入参;S4:信号发送函数收到请求后,根据请求中目标线程的名字从双向循环链表中获取对应目标线程节点的数据域,然后将待传递的数据存储到目标线程中数据域的数据存储结构;S5:目标线程持续查询自身数据域的数据存储结构,通过调用查询函数返回新的已传递数据。
[0008]进一步完善上述技术方案,所述线程信息的数据结构为:struct tThreadInfo{struct list_head list;pthread_t pid;char threadName[32];tThreadQueue msgList;pthread_mutex_t threadQueueMutex;};其中,struct tThreadInfo代表线程信息tThreadInfo为结构体类型,每个线程信
息tThreadInfo的结构体包含的元素有:数据类型struct list_head包含两个指向list_head结构的指针prev和next,元素list用于遍历双向循环链表;数据类型pthread_t是声明线程ID,元素pid用于存放线程id;数据类型char为字符串,元素threadName[32]用于存放线程名字,字符串的位数是32位;数据类型tThreadQueue为自定义的结构体,元素 msgList用于存放线程间传递的数据信息;数据类型pthread_mutex_t为线程锁,元素threadQueueMutex针对msgList的锁,对msgList的访问进行保护。
[0009]进一步地,所述msgList为一个队列,满足先入先出原则,采用循环数组实现。
[0010]进一步地,每所述元素msgList的数据结构tThreadQueue定义为:struct tThreadQueue{tThreadMsg msgQueue[N];int front;int rear;};其中: msgQueue[N]存放的是真正的交互信息,包括信号以及携带的数据,N为单个线程存储的数据条数,每条交互信息tThreadMsg数据结构为:struct tThreadMsg{int signal;void *pMsgData;};其中,signal变量用于存放msgQueue的信号,*pMsgData 变量用于存放msgQueue中的数据;int front是指头指针,始终指向队列的头部,int rear是指尾指针,始终指向队列的尾部。
[0011]信号的作用是告诉目标线程,本次传递的消息需要执行哪种功能,目标线程根据信号的不同,会执行不同的逻辑处理。例如目标线程支持拍照,录音,录视频等功能,那么就是通过不同的信号来告诉目标线程去执行哪种功能。
[0012]进一步地,所述发送函数为sendSignalToThread函数,将待传递的数据以及目标线程名字作为函数入参,sendSignalToThread会从双向循环链表中,根据目标线程的名字,找到该目标线程的tThreadInfo结构,将发送方线程待传递的数据插入到tThreadInfo中的msgList中。
[0013]进一步地,所述查询函数为GetThreadSignal函数,函数入参为目标线程的名字,目标线程通过GetThreadSignal函数查询自身的tThreadInfo中的msgList结构,将msgList取出来作为返回值返回。
[0014]有益效果:与现有技术相比,本专利技术的优点在于:采用纯C编码,线程间可以直接通过发送信号来通信,信号里可以携带自定义数据,灵活性和适用性很强,可以在C/C++项目中使用。本专利的代码是在Linux系统中实现的,稍作修改即可在Windows下运行。
附图说明
[0015]图1是本专利技术中进行线程管理的示意图;图2是本专利技术中消息队列的示意图。
具体实施方式
[0016]下面通过附图对本专利技术技术方案进行详细说明,但是本专利技术的保护范围不局限于所述实施例。
[0017]本专利技术提供的基于信号的线程间通信方法,包括线程的管理以及线程间的数据交互。
[0018]线程的管理如图1所示,采用linux内核中的双向循环链表(list.h)来管理新起的
线程,每当启动新线程时,将线程信息的数据结构插入到该链表中,线程信息的数据结构如下:typedef struct tThreadInfo{
ꢀꢀꢀꢀ
struct list_head list;
ꢀꢀꢀꢀ
pthread_t pid;
ꢀꢀꢀꢀ
char threadName[32];
ꢀꢀꢀꢀ
tThreadQueue msgList;
ꢀꢀꢀꢀ
pthread_mutex_t threadQueueMutex;}tThreadInfo;每个线程都有一个对应的tThreadInfo结构数据,其中list_head存放next和prev指针,用于遍历链表,pid存放线程id,threadName存放线程名字,msgList用于存放线程之间传递的数据信息,包含传递的信号以及数据,threadQueueMutex是针对msgList的锁,对msgList的访问进行保护。
[0019]threadQueueMutex本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于信号的线程间通信方法,其特征在于,包括如下步骤:S1:创建双向循环链表;S2:启动线程,将线程信息的数据结构插入到所述双向循环链表中对应线程节点的数据域;S3:发送方线程调用信号发送函数向目标线程请求发送数据,调用信号发送函数时,发送方线程将目标线程的名字和待传递的数据作为函数入参;S4:信号发送函数收到请求后,根据请求中目标线程的名字从双向循环链表中获取对应目标线程节点的数据域,然后将待传递的数据存储到目标线程中数据域的数据存储结构;S5:目标线程持续查询自身数据域的数据存储结构,通过调用查询函数返回新的已传递数据。2.根据权利要求1所述的基于信号的线程间通信方法,其特征在于:所述线程信息的数据结构为:struct tThreadInfo{struct list_head list;pthread_t pid;char threadName[32];tThreadQueue msgList;pthread_mutex_t threadQueueMutex;};其中,struct tThreadInfo代表线程信息tThreadInfo为结构体类型,每个线程信息tThreadInfo的结构体包含的元素有:数据类型struct list_head包含两个指向list_head结构的指针prev和next,元素list用于遍历双向循环链表;数据类型pthread_t是声明线程ID,元素pid用于存放线程id;数据类型char为字符串,元素threadName[32]用于存放线程名字,字符串的位数是32位;数据类型tThreadQueue为自定义的结构体,元素 msgList用于存放线程间传递的数据信息;数据类型pthread_mutex_t为线程锁,元素threadQueueMutex针对ms...

【专利技术属性】
技术研发人员:宋强刘爽闵济海
申请(专利权)人:南京天创电子技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1