2

我知道有可用的函数和库允许 c 中的并发。

(pthread.h、fork() 等)

但是,我想知道是否有任何方法可以在 C 中模拟并发,而实际上不必使用多个线程?

示例场景:

有一个主程序循环运行和输出计算。不知何故,另一个函数通知主函数时间现在是下午 12:00,并且程序应该在用户去吃午饭时停止输出计算。在 12:30,该函数通知主函数再次开始输出计算。

有人可以指出我如何做到这一点的正确方向吗?

编辑:

从本质上讲,我相信应该有两种方法来做到这一点:

第一个是主程序不断检查备用功能,以便知道时钟何时到达 12:00。(这很简单,我知道怎么做)

第二个是让备用功能在需要时(即在 12:00 和 12:30)联系主程序。

4

2 回答 2

2

在我看来,您只需要一个简单的计时器即可alarm()

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

volatile unsigned stop_working = 0;

void alarm_handler(int signum)
{
    stop_working = 1;
    //alarm(1); //reschedule alarm
}

int main()
{        
    signal(SIGALRM, alarm_handler);
    alarm(1); //schedule alarm in seconds

    while (!stop_working) {
      //do some work
    }
}

但是,如果您想要使用协程之类的东西,您应该使用类似makecontext()swapcontext()

注意:这个例子是特定于 UNIX/Linux 的,对于 MinGW,你需要使用 winapi,使用 , 等CreateWaitableTimer()函数SetWaitableTimer()。有关详细信息,请参阅 MSDN。

于 2012-11-17T21:12:01.930 回答
0

如果您有多个需要同时运行的任务,那么并发模型(无论是否模拟)都是有意义的。在这种情况下,您似乎只有一项任务要运行。

如果您的唯一要求是您的计算在 12:00 停止并在 12:30 重新开始,那么您所需要的只是确保您的计算可以分成小步骤,以便您有机会检查在步骤之间开始和停止。这是一些伪代码:

while (true) {
    current_time = get_current_time();
    if (current_time >= 12:00 and current_time < 12:30)
        sleep(12:30 - current_time);
    else
        perform_calculation_step();
}

如果启动和停止条件比您在示例中指出的更复杂,您可以将启动/停止逻辑抽象为一个单独的函数。例子:

while (true) {
    wait_if_necessary(); // this blocks when the app is not allowed to run
    perform_calculation_step()
}

我希望这有帮助!

于 2012-11-17T21:52:02.350 回答