gpt4 book ai didi

c - 用 pthreads 模拟循环

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:06 24 4
gpt4 key购买 nike

任务是同时存在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

由于程序报错了一个线程暂时没有结束,所以我认为问题是这个线程无法解锁让下一个线程抢到锁。我的 sleep() 也不起作用。但我不知道如何修改我的代码以修复它们。我的代码如下:

#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;
}

程序可以直接运行。谁能帮我弄清楚?谢谢!

最佳答案

我在阅读您的代码时发现了一些事情:

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

  1. 最好让 int 变成 volatile,这样编译器就不会假设它的值不变。

  2. 当您第二次调用函数 sleep 时,您传递了一个类型为 double (times[i]) 的参数,并且您应该传递一个 unsigned int 参数。像 (unsigned int) times[i] 这样的直接转换应该可以解决这个问题。

  3. 您正在执行 pthread_join before 创建其他线程。当您创建线程 3 时,它进入忙等待状态,其他线程将不会被创建。尝试将联接放在 for block 之后。

关于c - 用 pthreads 模拟循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9864492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com