Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 使用线程刺激赛车游戏_C_Multithreading_Posix - Fatal编程技术网

C 使用线程刺激赛车游戏

C 使用线程刺激赛车游戏,c,multithreading,posix,C,Multithreading,Posix,我试着用线在100米的赛道上比赛6只蜗牛。这是全部代码。为什么有些蜗牛根本不跑?为什么 他们没有跑完100米的赛道?(实际上我希望他们都能到达终点线。然后我会在节目结束时打印获奖者。) struct snail\u线程{ int-move; 字符snail_名称[10]; 字符所有者[10]; }; 整数和=0; void printval(void*ptr){ 结构snail_线程*数据; 数据=(结构线程*)ptr; 而(总和移动; printf(“%s移动%d mm,总计:%d\n”,数据

我试着用线在100米的赛道上比赛6只蜗牛。这是全部代码。为什么有些蜗牛根本不跑?为什么 他们没有跑完100米的赛道?(实际上我希望他们都能到达终点线。然后我会在节目结束时打印获奖者。)

struct snail\u线程{
int-move;
字符snail_名称[10];
字符所有者[10];
};
整数和=0;
void printval(void*ptr){
结构snail_线程*数据;
数据=(结构线程*)ptr;
而(总和<100){
总和+=数据->移动;
printf(“%s移动%d mm,总计:%d\n”,数据->名称,数据->移动,总和);
}
pthread_退出(0);
}
内部主(空){
pthread_t[6];
结构snail_线程s[6];
int i;
srand(时间(空));
对于(i=0;i<6;i++)
s[i].move=rand()%((5+1)-1)+1;
strcpy(s[0]。蜗牛名称,“蜗牛A”);
strcpy(s[0]。所有者,“Jon”);
strcpy(s[1]。蜗牛的名字,“蜗牛B”);
strcpy(s[1]。所有者,“本”);
strcpy(s[2]。蜗牛的名字,“蜗牛C”);
strcpy(s[2]。所有者,“标记”);
strcpy(s[3]。蜗牛的名字,“蜗牛D”);
strcpy(s[3]。所有者,“Jon”);
strcpy(s[4]。蜗牛的名字,“蜗牛E”);
strcpy(s[4]。所有者,“标记”);
strcpy(s[5]。蜗牛的名字,“蜗牛F”);
strcpy(s[5]。所有者,“本”);
对于(i=0;i<6;i++)
pthread_创建(&t[i],NULL,(void*)和printval,(void*)&s[i]);
对于(i=0;i<6;i++)
pthread_join(t[i],NULL);
返回(0);
}

因为你的
总和是全局的,所有的蜗牛都在增加它

sum
也放在
struct

另一个小技巧是,为了获得更好的结果,请对每个步骤进行
移动
随机。现在
移动
与速度相同,你可以知道谁不参加比赛就赢了


(来吧,给你的蜗牛起个比“蜗牛A”;-)更好的名字。)

线程体的原型应该是
void*printval(void*ptr)
。使用强制转换关闭编译器是通往地狱的捷径。也许会有一个更有意义的名字。Posix本身已经做了足够多的错误命名,不需要帮助他让您感到困惑:)

但这不是你的蜗牛不比赛的原因。原因是总和是一个全局变量,所以所有蜗牛都在竞争增加它。当它达到100时,所有的蜗牛都认为它们已经完成并离开了

将sum作为线程上下文的一部分,它应该按预期工作


编辑:当,我输了比赛…

先生,我为什么还要把sum放在结构中?@Ralf17,因为它是蜗牛的当前位置。每只蜗牛都有自己的位置。
struct snail_thread{
    int move;
    char snail_name[10];
    char owner[10];
};

int sum = 0;

void printval(void *ptr) {
    struct snail_thread *data;
    data = (struct snail_thread *) ptr;

    while(sum < 100) {
        sum += data->move;
        printf("%s moves %d mm, total: %d\n",data->snail_name, data->move, sum);
    }

    pthread_exit(0);
}

int main(void) {
    pthread_t t[6];
    struct snail_thread s[6];
    int i;

    srand(time(NULL));

    for(i = 0; i < 6; i++)
        s[i].move = rand() % ((5 + 1) - 1) + 1;

    strcpy(s[0].snail_name, "Snail A");
    strcpy(s[0].owner, "Jon");

    strcpy(s[1].snail_name, "Snail B");
    strcpy(s[1].owner, "Ben");

    strcpy(s[2].snail_name, "Snail C");
    strcpy(s[2].owner, "Mark");

    strcpy(s[3].snail_name, "Snail D");
    strcpy(s[3].owner, "Jon");

    strcpy(s[4].snail_name, "Snail E");
    strcpy(s[4].owner, "Mark");

    strcpy(s[5].snail_name, "Snail F");
    strcpy(s[5].owner, "Ben");


    for(i = 0; i < 6; i++)
        pthread_create(&t[i],NULL,(void *) &printval, (void *) &s[i]);

    for(i = 0; i < 6; i++)
        pthread_join(t[i], NULL);

    return (0);
}