0

4 つのスレッドを作成しましたが、このプログラムを実行すると、次のような出力が得られます。

Thread #: 1  
Thread #: 2 
Thread #: 3 
Thread #: 3 
Thread #: 4 
Thread #: 4 
Thread #: 4
Thread #: 5 
Thread #: 5 
Thread #: 5
.
.
.
Thread #: 5 
Thread #: 5 

2 つの質問があります。

  1. スレッドは 4 つしか作成していないのに、なぜスレッド #: 5 が表示されるのですか?
  2. 作成された 4 つのスレッドはすべて順次実行されるはずですが、最後に作成されたスレッドのみが実行されるのはなぜですか?

ソースコード:

#include<windows.h>


HANDLE ThreadHandle[4];
DWORD dwThreadId[4];

DWORD WINAPI ThreadFunction(LPVOID param)
{

    while (1)
    {

        printf("Thread #: %d\n", *((int*)param));
    }

    Sleep(10);

    return 0;
}

int main()
{
    static int i = 0;
    for (i = 1; i <= 4; i++)
    {
        ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]);
        Sleep(10);

    }       
    while (1)
    {
        Sleep(100);
    }
    return 0;
}
4

1 に答える 1

7

iは静的変数です。インスタンスは 1 つだけです。そのアドレスをスレッドに渡し、呼び出すたびに逆参照していますprintf。そのため、メイン スレッドが の値を変更するとiすべてのワーカー スレッドがすぐに新しい値を認識します。まさにその理由で、スレッド #5 が表示されます。iこれは、for()ループが終了した後の値です。

の代わりに(LPVOID)&iを渡し(LPVOID)i、スレッド内では の(int)param代わりに を使用し*((int*)param)ます。int へのポインタのキャストとその逆は、C では合法です (ただし、誤用すると危険です)。

于 2015-01-12T15:07:43.557 に答える