4

これは私のコードです。とても簡単です。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *func(void *arg)
{
    printf("ID=%d\n", *(int*)arg);
    pthread_exit(NULL);
}

int main()
{
    pthread_t pt[4];
    int i;

    for (i = 0; i < 4; i++)
    {
        int temp = i;
        pthread_create(&pt[i], NULL, func, (void*)&temp);
    }
    sleep(1);
    return 0;
}

私はそれをコンパイルしました:

gcc p_test.c -lpthread

私はそれを実行しました。印刷し2 2 3 3ました。もう一度実行しました。印刷し2 3 3 2ました。

私の問題は:

なぜ2回印刷されたのです2か?3

1 3 2 0印刷またはその他の結果が表示されなかったのはなぜですか?

4

4 に答える 4

7

ここでの主な問題は、ローカル変数のアドレスを取得し、tempそのポインターを変数のスコープ外で使用していることです。ループの 1 回の繰り返しを終了するとすぐに、へのポインターtempが無効になり、逆参照してはなりません。それ。

于 2012-06-04T12:19:17.673 に答える
3

一時変数へのポインターをスレッド作成関数に渡していますが、この一時変数はループ ブロックの最後で範囲外になります。一時アドレスがコンパイラによって再利用されているように見えるので、スレッドが実行されているときに同じアドレスの場所が表示されます。

もしあなたがそうするなら:

int *temp = malloc(sizeof(int));
*temp = i;
pthread_create(&pt[i], NULL, func, (void*)temp);

代わりに、期待どおりの結果が表示されるはずです。

この場合、スレッド関数はint、メモリ リークを回避するために、出力後に を解放する必要があります。

また、単にing するpthread_join()よりも、待機しているスレッドを実行することをお勧めします。sleep()

于 2012-06-04T12:21:15.060 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *func(void* arg)
{
printf("ID=%d\n", (int)arg);
pthread_exit(NULL);
return 0;
}

int main()
{
pthread_t pt[4];
int i;

for (i =0 ; i < 4; i++)
{

    pthread_create(&pt[i], NULL, func, (void*)i);
    pthread_join(pt[i],NULL);
}



return 0;

}

于 2014-12-02T09:56:51.323 に答える
0

temp を出力するため、すべてのスレッドがメモリを共有するため (temp が「共有」される理由は TheJuice で説明されています)、すべてのスレッドが temp を「共有」します。ミューテックスを使用するか、temp をプライベート変数にします。 スレッド内のプライベート変数

または、次のようにphtread_joinを使用できます。

int main()
{
    pthread_t pt[4];
    int i;

    for (i =0 ; i < 4; i++)
    {

      pthread_create(&pt[i], NULL, func, (void*)&i);
      pthread_join(pt[i],NULL);

    }

    //sleep(1);
    return 0;
}
于 2012-06-04T12:28:04.083 に答える