用信号量实现实时多任务管理(二)

本文介绍了一种HTTP实时下载模块的设计方案,该方案包括7个线程:主线程、分发线程及5个任务线程。通过MSW消息机制进行消息传递,使用信号量协调各线程工作,确保了下载任务的有效分配与执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

                                     HTTP实时下载模块设计

一、概述:
 此模块主要用于实现实时实习下载http任务。
 其中主要设计7个线程。分别为:主线程、分发线程和5个任务线程。
主线程(HttpProcess):
目的:通过MSW消息机制,从模块Mx接收http请求消息,并存储在一个大小受限的循环队列中。
返回值:返回模块Mx循环队列满状态,不能再接收消息。
分发线程(DistribProcess):
目的:从循环队列中读取消息,并分发给5个任务线程。
任务线程(TaskProcess,5个):
          目的:接收分发线程的任务,实现下载。
          返回值:返回模块Mx下载任务完成信息。
二、线程间关系:
设计7组信号量来激活不同想线程。分别为:
SemCycle,SemDistrib,SemWork0,SemWork1,SemWork2,SemWork3,SemWork4
 
SemCycle:
作用:记录循环队列中httpInfo的数目,每收到一个信息SemCycle+1,
初值:0,sleep,可供下载的信息,没有可用资源
最大值:队列的最长数目CycleMax
SemDistrib:
作用:记录空闲任务线程数目
初值:5,表示有可以使用的空闲任务线程数目是五个,表示有可用资源
最大值:5
SemWorki:
          作用:记录任务线程i 是否在空闲状态中
          初值:0,sleep,表示可以接收下载任务,有可用资源
最大值:1
          i = 0,1,2,3,4;
 
主线程:来自下载模块的httpInfo,
有 httpInfo 信息, SemCycle+1,if (SemCycle == CycleMax) ,返回循环队列满状态
分发线程:当SemDistrib>0 èSemWorki= 0,从循环队列中取出httpInfo,且SemCycle-1
          且 SemWorki+1èwake激活任务线程, SemDistrib-1
任务线程:完成下载任务,SemWorki-1èSleep挂起任务线程, SemDistrib +1
 
三、流程图:
   主线程(HttpProcess):


分发线程(DistribProcess):

 

任务线程(TaskProcesi,i=0,1,2,3,4):


四、 数据结构定义:
数据:

Typedef struct tagHttpTask
{
ULONG ulDstModName;
CHAR  szFilePathName[MAX_FILENAMELEN+1];
}HttpTask_S
循环队列: 
#define MAX_TASK  100
Typedef struct tagCycleQueue
{
Int  iwtFront;
Int  irdRear;
HttpTask_S  stTask[MAX_TASK];
}

队列空:

iwtFront == irdRear

队列满:

(iwtFront+1 ) %MAX_TASK ==  irdRear

获取任务:
#define WORK_THREAD  5
Http_Task_S  szGetTask[ WORK_THREAD];
信号量:
#define  SEM_NUM     2+ WORK_THREAD
#define  SemCycle       0
#define  SemDistrib      1
#define  SemWorkBase   2
Unsigned shot arry[SEM_NUM];


转载于:https://my.oschina.net/stz/blog/726048

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值