【问题标题】:Stimulate a racing game using threads使用线程刺激赛车游戏
【发布时间】:2014-01-03 07:37:58
【问题描述】:

我正在尝试使用线程在 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);
}

【问题讨论】:

    标签: c multithreading posix


    【解决方案1】:

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

    sum 也放入struct

    另一个小技巧,为了获得更好的结果,为每个步骤设置move 随机。现在move和速度一样,不用跑就知道谁赢了。

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

    【讨论】:

    • 先生,为什么我还要把 sum 放入结构体中?
    • @Ralf17 因为它是蜗牛的当前位置。每只蜗牛都有自己的位置。
    【解决方案2】:

    线程主体的原型应为void * printval (void * ptr)。使用强制转换关闭编译器是通向地狱的捷径。也许给了一个更有意义的名字。 Posix 自己的命名已经够糟糕了,没必要帮他弄糊涂:)。

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

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

    编辑:该死,我输了比赛……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多