Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用pthreads模拟循环_C_Operating System_Pthreads_Scheduling - Fatal编程技术网

C 用pthreads模拟循环

C 用pthreads模拟循环,c,operating-system,pthreads,scheduling,C,Operating System,Pthreads,Scheduling,任务是同时有5个线程,用户为每个线程分配一个突发时间。然后使用量子数为2的循环算法来调度线程。例如,如果我使用 $ ./m 1 2 3 4 5 输出应该是 A 1 B 2 C 2 D 2 E 2 C 1 D 2 E 2 E 1 但目前我的输出仅显示 A 1 B 2 C 2 由于程序在一个线程暂时没有结束时出错,我认为问题在于这个线程无法解锁以让下一个线程获得锁。我的睡眠也不起作用。但是我不知道如何修改我的代码来修复它们。我的代码如下: #include <stdio.h> #i

任务是同时有5个线程,用户为每个线程分配一个突发时间。然后使用量子数为2的循环算法来调度线程。例如,如果我使用

$ ./m 1 2 3 4 5
输出应该是

A 1
B 2
C 2
D 2
E 2
C 1
D 2
E 2
E 1
但目前我的输出仅显示

A 1
B 2
C 2
由于程序在一个线程暂时没有结束时出错,我认为问题在于这个线程无法解锁以让下一个线程获得锁。我的睡眠也不起作用。但是我不知道如何修改我的代码来修复它们。我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
double times[5];
char process[] = {'A', 'B', 'C', 'D', 'E'};
int turn = 0;

void StartNext(int tid)     //choose the next thread to run
{
    int i;
    for(i = (tid + 1) % 5; times[i] == 0; i = (i + 1) % 5)
        if(i == tid)    //if every thread has finished
            return;
    turn = i;
}

void *Run(void *tid)    //the thread function
{
    int i = (int)tid;
    while(times[i] != 0)
    {
        while(turn != i);   //busy waiting till it is its turn
        if(times[i] > 2)
        {
            printf("%c 2\n", process[i]);
            sleep(2);   //sleep is to simulate the actual running time
            times[i] -= 2;
        }
        else if(times[i] > 0 && times[i] <= 2)      //this thread will have finished after this turn
        {
            printf("%c %lf\n", process[i], times[i]);
            sleep(times[i]);
            times[i] = 0;
        }
        StartNext(i);   //choose the next thread to run
    }
    pthread_exit(0);
}

int main(int argc, char **argv)
{
    pthread_t threads[5];
    int i, status;

    if(argc == 6)
    {
        for(i = 0; i < 5; i++)
            times[i] = atof(argv[i + 1]);   //input the burst time of each thread
        for(i = 0; i < 5; i++)
        {
            status = pthread_create(&threads[i], NULL, Run, (void *)i);    //Create threads
            if(status != 0)
            {
                printf("While creating thread %d, pthread_create returned error code %d\n", i, status);
                exit(-1);
            }
            pthread_join(threads[i], 0);    //Join threads
        }
    }
    return 0;
}
#包括
#包括
#包括
双倍[5];
字符进程[]={'A','B','C','D','E'};
整圈=0;
void StartNext(int tid)//选择要运行的下一个线程
{
int i;
对于(i=(tid+1)%5;乘以[i]==0;i=(i+1)%5)
if(i==tid)//如果每个线程都已完成
返回;
转身=我;
}
void*Run(void*tid)//线程函数
{
int i=(int)tid;
while(次[i]!=0)
{
while(轮到);//忙着等着轮到它
如果(乘以[i]>2)
{
printf(“%c2\n”,进程[i]);
sleep(2);//sleep是模拟实际运行时间
乘以[i]=2;
}

否则,如果(times[i]>0&×[i]我在阅读您的代码时发现了一些问题:

1.在Run函数的开头,您将tid(指向void的指针)直接转换为int。您不应该取消对它的引用吗

  • 最好使int变为volatile,这样编译器就不会对其值不改变做出任何假设

  • 第二次调用函数sleep时,传递的参数类型为double(times[i]),应该传递一个无符号int参数。类似于
    (unsigned int)times[i]
    的直接强制转换应该可以解决这个问题

  • 在创建其他线程之前,您正在执行pthread_连接。当您创建线程3,并且它进入忙等待状态时,将不会创建其他线程。请尝试将连接放在for块之后


  • 谢谢。我真的不明白应该如何根据你的第一点修改我的代码。它仍然不能解决问题…在我的示例中,是否实际创建了突发时间为“4”的线程?第一点你是对的,你直接将int嵌入指针,我没有看到。但是,可能有一个问题,是的,与线程创建,我将edi答案。谢谢!我应该已经意识到“加入”问题。现在它被修复了,谢谢:)最后一个问题:“加入”是什么函数真的在这里运行吗?如果我删除这一行,程序将无法运行,但是为什么?如果没有连接,主线程将在创建其他线程后立即终止,从而杀死进程和新线程。因此连接只是为了阻止主线程退出:)更多信息:嘿,如果它真的响应了你你的问题是,为什么不接受它