簡體   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