c - 使用线程刺激赛车游戏

标签 c multithreading posix

我正在尝试使用线程在 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 中。

另一个小技巧,为了获得更好的结果,使每个步骤的移动随机。现在移动与速度相同,您无需比赛即可知道谁获胜。

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

关于c - 使用线程刺激赛车游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20898874/

相关文章:

c# - asp.net core 如何杀死一个线程

c - 在 C 编程中存储日志/错误消息

macos - 内存是否被锁定(固定)?

c - SIGSTOP/SIGCONT POSIX 行为

c - ubuntu 使用可加载模块读取文件

c - 在 switch case 语句中使用变量

c - 这个简单的 If 语句有什么作用?

c# - BackgroundWorker 异常处理

c++ - 如何在一个switch中实现多个case的一些独占语句和一些公用语句?

c++ - 使用 std::promise 和 std::future 时发生访问冲突