繁体   English   中英

使用线程刺激赛车游戏

[英]Stimulate a racing game using threads

我正在尝试使用线程在100m跑道上赛跑6只蜗牛。 这是完整的代码http://ideone.com/An30s4 为什么有些蜗牛根本不运行? 他们为什么不完成100m航迹? (实际上,我希望所有人都达到终点。然后,我将在计划结束时打印获奖者。)

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

因为您的sum是全局的,并且所有蜗牛都在增加它。

sum也放入struct

为了获得更好的结果,另一个小技巧是使每个步骤的move随机。 现在, move速度与速度相同,您可以知道谁在没有比赛的情况下获胜。

(来吧,给您的蜗牛一个比“蜗牛A”更好的名称;-))。

线程主体应原型化为void * printval (void * ptr) 用强制转换关闭编译器是通向地狱的捷径。 也许给了一个更有意义的名字。 Posix独自进行了很多错误的命名,无需帮助他让您感到困惑:)。

但这不是您的蜗牛不参加比赛的原因。 原因是总和是一个全局变量,因此所有蜗牛都在争相增加它。 一旦达到100,所有蜗牛都认为它们已经完成并退出。

使sum成为线程上下文的一部分,它应可按预期工作。

编辑:当,我输了比赛...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM