当前位置: 首页 > 知识库问答 >
问题:

C中的循环调度程序

许胡非
2023-03-14

我需要一些循环调度程序的帮助。它旨在获取外部 C 文件并将它们放入队列中,同时显示其当前状态,并通过轮循机制调度执行它们。这是我到目前为止所拥有的:

#include<pthread.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>

enum states {running, ready, waiting, idle};

struct process{
    //command to run process
    enum states state;
    int id;

};

struct process procs[5];
int procSize = 5;

void *runProcess(struct process *p)
{
    while(1)
    {
        printf("Process %i is running", p->id);
        sleep(1);
    }
}

void *takeInput(void *vargp)
{
    //print process statuses when 'procs' is entered
    while(1)
    {
        char *str[64];
        fgets(str, 64, stdin);

        if (strcmp(str, "procs"))
        {
            for (int i = 0; i < procSize; i++)
            {
                printf("Process %i: %i\n", procs[i].id, procs[i].state);
            }
        }
    }
}

void *schedule(void *vargp)
{
    struct process p = procs[0];
    if (p.state == idle)
    {
        p.state = ready;
    }
    if (p.state == ready)
    {
        p.state = running;
        pthread_t run;
        pthread_create(&run, NULL, runProcess, &p);
        //pthread_join(run, NULL);
        sleep(5);
        pthread_cancel(run);
        p.state = ready;

        for(int i = procSize - 1; i > 0; i--)
        {
            procs[i-1] = procs[i];
        }
        procs[procSize] = p;
    }
    else if (p.state == waiting)
    {
        for(int i = procSize - 1; i > 0; i--)
        {
            procs[i-1] = procs[i];
        }
        procs[procSize] = p;
    }

}

int main()
{
    for (int i = 0; i < 5; i++)
    {
        struct process p;
        p.state = idle;
        p.id = i;
        procs[i] = p; 
    }

    pthread_t schedulerid;
    pthread_t inputid;

    pthread_create(&schedulerid, NULL, schedule, NULL);
    //pthread_join(schedulerid, NULL);
    pthread_create(&inputid, NULL, takeInput, NULL);
    //pthread_join(inputid, NULL);
}

当我尝试运行它时,我没有收到任何错误,只有警告,没有任何反应。我需要改进什么?尝试使用线程调用函数是否存在问题?任何帮助,不胜感激。

更新时出现警告:

Sched.c:35:20: warning: passing argument 1 of ‘strcmp’ from incompatible pointer type [-Wincompatible-pointer-types]
   35 |         if (strcmp(str, "procs"))
      |                    ^~~
      |                    |
      |                    char **
In file included from Sched.c:3:
/usr/include/string.h:137:32: note: expected ‘const char *’ but argument is of type ‘char **’
  137 | extern int strcmp (const char *__s1, const char *__s2)
      |                    ~~~~~~~~~~~~^~~~
Sched.c: In function ‘schedule’:
Sched.c:56:36: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]
   56 |         pthread_create(&run, NULL, runProcess, &p);
      |                                    ^~~~~~~~~~
      |                                    |
      |                                    void * (*)(struct process *)
In file included from Sched.c:1:
/usr/include/pthread.h:200:15: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(struct process *)’
  200 |       void *(*__start_routine) (void *),
      |       ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~

共有1个答案

孙昂然
2023-03-14

让我们修复这些警告

    char *str[64];
    fgets(str, 64, stdin);

    if (strcmp(str, "procs"))

应该是

    char str[64];
    fgets(str, 64, stdin);

    if (strcmp(str, "procs"))

然后

    pthread_create(&run, NULL, runProcess, &p);

该函数必须是 void* 函数 (void*)

因此,将运行过程更改为

void *runProcess(void *v)
{
    struct process *p =(struct process*)v;
    while(1)
    {
        printf("Process %i is running", p->id);
        sleep(1);
    }
}

通过一个空洞,把它铸造成你需要的样子

现在编译时没有任何警告。

最后把你的连接放回去

int pt1 = pthread_create(&schedulerid, NULL, schedule, NULL);
int pt2 = pthread_create(&inputid, NULL, takeInput, NULL);
printf("%d %d \n", pt1, pt2);
pthread_join(schedulerid, NULL);
pthread_join(inputid, NULL);

最后一点——您真的必须测试所有系统调用的返回,以确保它们工作正常

它在这里运行

pm100@paul-think:~/ut$ gcc ggg.c -g -lpthread
pm100@paul-think:~/ut$ ./a.out
Process 0 is running
 类似资料:
  • 我正在设计一个应用程序,它有一个经常性的任务,即只要应用程序处于前台,就可以将状态发送到一个专用服务器。 在我的网上搜索中,我看到了几种不同的方法,我想知道什么是最好的方法。 安排服务器调用的最佳方法是什么? 我看到的选项是: > 定时器。 ScheduledThreadPoolExecutor. 服务。 带有AlarmManager的BroadcastReciever。 你的意见呢? 编辑: 我

  • 主要内容:优点,缺点轮循调度算法是最流行的调度算法之一,它可以在大多数操作系统中实际实现。 这是先到先得的排程先发制人的版本。 该算法着重于时间共享。 在这个算法中,每个进程都以循环方式执行。 在称为时间量的系统中定义了一定的时间片。 就绪队列中的每个进程都分配给该时间段的CPU,如果在该时间内进程的执行完成,那么进程将终止,否则进程将返回就绪队列并等待下一轮完成 执行。 优点 它可以在系统中实际实现,因为它不依赖于

  • 本文向大家介绍C和C ++中的循环,包括了C和C ++中的循环的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论一个程序,以了解C和C ++中的循环。 当我们不得不一次又一次地执行给定的块代码时,使用编程中的循环。它采用了一次又一次编写同一代码行的方法,并促进了DRY代码实践。 示例 对于循环 输出结果 While循环 输出结果

  • 问题内容: 哪个对性能更好?这可能与其他编程语言不一致,因此,如果它们不同,或者如果您可以使用特定语言来回答我的问题,请解释。 我将以c ++为例,但是我想知道它如何在java,c或任何其他主流语言中工作。 VS 哪个表现更好?如果它是for循环,那么可以说已经声明了一个可以在while循环增量中使用的整数,我们是否不需要为while循环创建? 例: 与创建for循环相比,此实例是否会使while

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 我们的(Spring)应用程序包含几个,这些调度器在夜间活动,以更改/更新中的一些数据(来自 )。 这一切都运行良好,问题是我们的应用程序很快就会在运行。 防止< code >实例A和< code >实例B的< code >调度程序同时执行相同工作的最佳选项是什么? **UPDATE** 群集环境设置为。 每个节点都与自己的数据库实例通信。每个数据库实例将数据复制到其他实例。 DB-实例不是设置为

  • 本文向大家介绍C#中for循环、while循环循环执行的方法,包括了C#中for循环、while循环循环执行的方法的使用技巧和注意事项,需要的朋友参考一下 先给大家介绍下C#中的循环执行for循环 在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环。 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:逻辑表达式,循环控制条件;当条件为真时,循环执行循环体中的语句。

  • 在以下示例中,有六个进程分别命名为P1,P2,P3,P4,P5和P6。 他们的到达时间和爆发时间如下表所示。 系统的时间量是4个单位。 进程ID 到达时间 突发时间 1 0 5 2 1 6 3 2 3 4 3 1 5 4 5 6 6 4 根据算法,我们必须保持就绪队列和甘特图。 两个数据结构的结构在每次调度后都会改变。 就绪队列: 最初,在时间,过程P1到达,其将被安排为时间片4单位。 因此,在就