Xinu下实现一个异步的延时函数 delay(int seconds, void* func, …),要求该函数将目标函数 func 延时多少秒后执行,但该函数(delay)本身 不会像 sleep()那样阻塞当前进程
时间: 2023-05-23 09:05:09 浏览: 82
delay函数的编写及使用
A:
首先,需要在 Xinu 中实现一个定时器。可以使用定时器中断来实现延时效果。在定时器中断处理程序中,可以检查是否需要执行目标函数,如果需要,则调用目标函数。
具体实现步骤如下:
1. 定义一个全局链表,用于保存所有需要延时执行的任务。链表中的每个节点包含了任务的延时时间和目标函数指针。
2. 编写定时器中断处理程序,在每次中断时检查链表中的任务是否到达了延时要求。如果到达了,就执行相应的目标函数,并删除该任务节点。
3. 编写 delay 函数,在该函数中将新的任务节点添加到链表中,并返回。
注意事项:
1. 为了避免阻塞当前进程,应该使用非阻塞的延时方式。可以使用定时器中断来实现。
2. 要处理好任务的优先级问题。当中断处理程序执行一个任务时,它可能会被另一个更高优先级的任务打断。在这种情况下,应该将未执行的任务重新添加到链表中。
示例代码:
```
// 定义链表节点结构体
struct task {
int delay_time;
void* func;
// 其他任务参数
struct task* next;
};
// 定义链表头指针
struct task* task_list = NULL;
// 定时器中断处理程序
interrupt timer_handler() {
struct task* cur_task = task_list;
while (cur_task != NULL) {
cur_task->delay_time--;
if (cur_task->delay_time == 0) {
// 执行目标函数
void (*func)(void*) = cur_task->func;
func(NULL);
// 删除当前任务节点
if (task_list == cur_task) {
task_list = task_list->next;
} else {
struct task* prev_task = task_list;
while (prev_task->next != cur_task) {
prev_task = prev_task->next;
}
prev_task->next = cur_task->next;
}
struct task* tmp = cur_task;
cur_task = cur_task->next;
free(tmp);
} else {
cur_task = cur_task->next;
}
}
}
// delay 函数
void delay(int seconds, void* func, ...) {
// 创建新的任务节点
struct task* new_task = malloc(sizeof(struct task));
new_task->delay_time = seconds;
new_task->func = func;
// 其他任务参数的处理
// 将新任务添加到链表中
if (task_list == NULL) {
task_list = new_task;
} else {
struct task* cur_task = task_list;
struct task* prev_task = NULL;
while (cur_task != NULL && cur_task->delay_time < new_task->delay_time) {
new_task->delay_time -= cur_task->delay_time;
prev_task = cur_task;
cur_task = cur_task->next;
}
new_task->next = cur_task;
if (prev_task == NULL) {
task_list = new_task;
} else {
prev_task->next = new_task;
}
if (cur_task != NULL) {
cur_task->delay_time -= new_task->delay_time;
}
}
}
```
这是一个简单的实现,可以根据实际情况做出调整。
阅读全文