首页 > 试题广场 >

用 C 语言写一个函数来执行一串任务。任务是互相依赖的。比如

[问答题]
用 C 语言写一个函数来执行一串任务。任务是互相依赖的。比如 B 任务依赖 A 任 务,则 A 完成 B 才能执行。不考虑并发限制,假设所有的任务都能一次执行成功, 所有的任务执行时间都相等。任务数据结构原型为:
typedef struct {
    //该任务的 ID
    int id;
    //该任务依赖的任务的 ID
    int *child;
    //该任务依赖的任务个数
    int child_num;
} task;

// 函数原型:
bool doschedule(task*pask,inttask_num);

//以下函数可以直接调用:
void dotask(int id); //执行一个进程

//等待 timeout 时间,并返回一个执行成功的任务的 id,如果没有任务在时间片内完成,则返回-1
int waittask(int timeout);

bool killtask(int id); //杀掉一个进程 

1.通过拓扑排序来建立执行顺序.

2. 对于无关联的拓扑节点可以并发执行

发表于 2014-10-25 00:26:02 回复(1)
bool doschedule(task* pask, int task_num)<br /> {<br /> &nbsp;&nbsp; &nbsp;const int Timeout = 10;<br /> &nbsp;&nbsp; &nbsp;int* pFlag = new int[task_num];<br /> &nbsp;&nbsp; &nbsp;for (int i=0; i&lt;task_num; ++i)<br /> &nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pFlag[i] = pask[i].child_num;<br /> &nbsp;&nbsp; &nbsp;}<br /> <br /> &nbsp;&nbsp; &nbsp;int Count = 0;<br /> &nbsp;&nbsp; &nbsp;while (true)<br /> &nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int Index = -2;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i=0; i&lt;task_num; ++i)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (pFlag[i] == 0)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Index = i;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (Count == task_num)<span></span><br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return true;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else if (pFlag[Index] == -2)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;dotask(Index);&nbsp;&nbsp; &nbsp;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;waittask(Index);<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pFlag[Index]--;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Count++;<br /> <br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int k=0; k&lt;task_num; ++k)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int* pChild = pask[k].child;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int NumChild = pask[k].child_num;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int m=0; m&lt;NumChild; ++m)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (pChild[m] == Index)<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pFlag[k]--;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /> &nbsp;&nbsp; &nbsp;}<br /> }
发表于 2015-09-10 18:36:51 回复(0)
Lo.头像 Lo.
a as s
发表于 2014-11-13 11:35:05 回复(0)