c - 如何安排两个任务?

标签 c windows operating-system embedded scheduled-tasks

我是流程/任务管理方面的新手。 我想安排两个任务。 假设,

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。它甚至使用全局变量!然而,它确实有效。

该技术称为协作用户线程,也称为纤程。如前所述,我使用 setjmplongjmp 实现了它。 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/

相关文章:

c - 练习 #5 C 语言编程的第 6 章

c - 如何优化此代码并将正在读取的数据排序到数组中?

c++ - Win32 窗口创建失败?

JAVA 返回 "Linux-all-ports"作为 os.name。 "Linux"as os.name 相比有什么意义?

apache - 针对特定浏览器/操作系统组合的 .htaccess 重写

c - GTK信号什么时候发出

c - 安全地将 SIZE_T 转换为 WORD

windows - x86 程序中的控制台

c - WSAStringToAddress 错误 10022/从控制台参数读取 IPv6

linux - 文件复制时间变化