2

10 個のスレッドを作成し、スレッドが印刷された threadId を出力する必要があります。

#include <windows.h>
#include <stdio.h>

DWORD WINAPI xprint(LPVOID Param)
{
DWORD tID = GetCurrentThreadId();
int count = *(int*)Param + 1;

fprintf(stderr, "Thread Number:%d ThreadID:%d\n", count, tID);

return 0;
}

int main ()
{
   DWORD ThreadID[10];
   HANDLE ThreadHandle[10];
   int i;

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

    ThreadHandle[i] = CreateThread(
      NULL,
          0,
          xprint,
          &i,
          0,
          &ThreadID[i]);

    if (ThreadHandle[i] == NULL) {
        fprintf(stderr,"Can't create thread!\n");
        return -1;
        }
    }

    for (i=0; i<10; i++){
            WaitForSingleObject(ThreadHandle[i],INFINITE);
        CloseHandle(ThreadHandle[i]);
    }
}

出力:

Thread Number:1 ThreadID:4952
Thread Number:1 ThreadID:5284
Thread Number:1 ThreadID:5084
Thread Number:1 ThreadID:5656
Thread Number:1 ThreadID:5292
Thread Number:1 ThreadID:3072
Thread Number:1 ThreadID:5904
Thread Number:1 ThreadID:3620
Thread Number:1 ThreadID:6056
Thread Number:1 ThreadID:5676

どこを間違えたのかわからない。私の目的の出力は次のようになります。

出力:

Thread Number:10 ThreadID:4952
Thread Number:8 ThreadID:5284
Thread Number:3 ThreadID:5084
Thread Number:9 ThreadID:5656
Thread Number:1 ThreadID:5292
Thread Number:2 ThreadID:3072
Thread Number:5 ThreadID:5904
Thread Number:6 ThreadID:3620
Thread Number:4 ThreadID:6056
Thread Number:7 ThreadID:5676

スレッド番号は *順不同である必要があります。

*この質問を投稿した後、プログラムをさらに数回実行しました。

Thread Number:2 ThreadID:4500
Thread Number:7 ThreadID:5740
Thread Number:7 ThreadID:3772
Thread Number:1 ThreadID:4732
Thread Number:2 ThreadID:4252
Thread Number:2 ThreadID:4264
Thread Number:2 ThreadID:5544
Thread Number:2 ThreadID:4116
Thread Number:2 ThreadID:5240
Thread Number:2 ThreadID:4804

スレッド番号はランダムのようです。ただし、いずれにせよ、同じ数字が 2 回表示されることはありません。

4

3 に答える 3

2

の代わりに&i、必要に応じて渡しiてキャストバックしてみませんか? すべてのスレッドに同じアドレスを渡しています。

于 2012-10-22T22:45:40.447 に答える
0

これを変える:

&i

これに:

(void*)i

この:

int count = *(int*)Param + 1

これに:

int count = ((int)Param) + 1;
于 2012-10-23T01:58:43.877 に答える
0

私は Windows マシンを使用していないため、これをテストすることはできませんが、私が作成したプログラムでは、すべての値の配列を作成し、配列要素 ( int numbers[100]; &number[i]) へのポインターを作成しました。これが機能した理由は、2 番目のスレッドの実行中に変更していたためです。

于 2012-10-22T22:47:40.103 に答える