我是流程/任务管理方面的新手。 我想安排两个任务。 假设,
fun1()
{
printf("It will be printed in every 1 min \n");
}
fun2()
{
printf("It will be printed in every 2 min \n");
}
main()
{
fun1();
fun2();
}
那么如何安排它们,以便获得我想要的输出。
我希望它在 Code::Blocks (Windows) 中运行。 我希望 fun1 运行 1 分钟,fun2 每 2 分钟运行一次。 如果我也可以在两个单独的过程中完成,请告诉我该怎么做。 我是否需要使用信号量、互斥锁等等?
最佳答案
编辑:这是越来越受欢迎,所以我想为后代添加一个说明。这不是解决此问题的好方法 - 您永远不想手动执行此操作。协作用户线程很好,可以用来实现协程等聪明的东西,但如果你想这样做,你应该使用像 libcoroutine 这样的库。为您处理毛茸茸的部分。然而,虽然这不是一个实用的解决方案,但它仍然提出了一个有趣的想法,并且是一个有趣的调度示例和纯 C99 的局限性。
这是一个错误的答案。但是,它是平台无关的,而且只使用 C99 标准中定义的函数。
另一方面,它会占用 CPU(C99 中没有 sleep
函数,所以我们不得不忙等待),使用我只能称之为 magic 的东西来保留堆栈空间,并完全滥用 setjmp
。它甚至使用全局变量!然而,它确实有效。
该技术称为协作用户线程,也称为纤程。如前所述,我使用 setjmp
和 longjmp
实现了它。 context_switch
执行简单的循环调度。
这是代码:
#include <stdio.h>
#include <setjmp.h>
#include <time.h>
static jmp_buf jmp[2];
static int cur;
void context_switch()
{
/* sleep(1) */ /* C99 doesn't have any sleeping functions */
if (!setjmp(jmp[cur])) {
if ((sizeof(jmp)/sizeof(*jmp)) == ++cur)
cur = 0;
longjmp(jmp[cur], 1);
}
}
void fun2()
{
char cushion[1000]; /* reserve some stack space */
time_t old_time, new_time;
cushion[0] = '@'; /* don't optimize my cushion away */
old_time = time(NULL);
cur = 1; /* the first thread to context switch is this one */
setjmp(jmp[1]);
while (1) {
context_switch();
new_time = time(NULL);
if ((new_time - old_time) > (2 * 60)) {
old_time = new_time;
printf("Printed every 2 minutes\n");
}
}
}
void fun1()
{
char cushion[1000]; /* reserve some stack space */
time_t old_time, new_time;
cushion[0] = '@'; /* don't optimize my cushion away */
if (!setjmp(jmp[0]))
fun2();
old_time = time(NULL);
while (1) {
context_switch();
new_time = time(NULL);
if ((new_time - old_time) > (1 * 60)) {
old_time = new_time;
printf("Printed every 1 minute\n");
}
}
}
int main(int argc, char **argv)
{
fun1();
return 0;
}
这是我得到的输出:
$ gcc -ggdb -std=c99 -o silly silly_setjmp.c
$ ./silly
Printed every 1 minute
Printed every 2 minutes
Printed every 1 minute
Printed every 1 minute
...
关于c - 如何安排两个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8815961/