/*
用 C 语言写一个函数来执行一串任务。任务是互相依赖的。
比如 B 任务依赖 A 任 务,则 A 完成 B 才能执行。
不考虑并发限制,假设所有的任务都能一次执行成功,
所有的任务执行时间都相等。任务数据结构原型为:
*/
typedef struct {
//该任务的 ID
int id;
//该任务依赖的任务的 ID
int *child;
//该任务依赖的任务个数
int child_num;
} task;
// 函数原型:
bool doschedule(task *pask, int task_num);
//以下函数可以直接调用:
void dotask(int id); //执行一个进程
//等待 timeout 时间,并返回一个执行成功的任务的 id,如果没有任务在时间片内完成,则返回-1
int waittask(int timeout);
bool killtask(int id); //杀掉一个进程
借鉴:
方便管理数据使用结构体:
typedef struct
{
//该任务的 ID
int id;
//该任务依赖的任务的 ID
int *child;
//该任务依赖的任务个数
int child_num;
} task;
结构体成员分析:
id: 该任务的 ID:
给任务编号,不至于产生很多的任务(也有相同任务,但是不是相同的),给任务编号,不至于产生很多的任务(也有相同任务,但是不是相同的),
不知道是哪一个,提供编号,能够有效处理任务的唯一性
child:因为任务id是唯一的,所以依赖的任务,就用id来指定
child_num:依赖的数量
这个结构体使用
例如:
#define N 10
task *t = NULL;
t->child_num = N; //依赖的数量
t->child = (int *)malloc(t->child_num * sizeof(int));
t->child[0] = 1; //要依赖的id
......
free(t->child); //释放资源
free(t);
函数分析:
// 函数原型:
bool doschedule(task *pask, int task_num);
调度任务
pask:使用指针,根据地址传递,减少系统开销
不使用指针,而是使用 task pask, 会有副本机制,而且不能修改外部变量
task_num:
id号,任务id是唯一的,能够指定是哪个任务体
即使是相同的任务
返回值:bool,判断执行的状态
//以下函数可以直接调用:
void dotask(int id); //执行一个进程
执行进程,需要唯一id,
//等待 timeout 时间,并返回一个执行成功的任务的 id,如果没有任务在时间片内完成,则返回-1
int waittask(int timeout);
bool killtask(int id); //杀掉一个进程
也是根据id号
不足:
bool 在c中没有,要单独定义,例如
typedef int bool
int waittask(int timeout);
timeout 类型应该 long,
void dotask(int id); //执行一个进程
返回值,应该有成功和失败