将参数传递给循环中的线程

时间:2012-10-22 22:44:04

标签: c multithreading winapi

我需要创建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
似乎线程编号是随机的。但在任何情况下,都不应出现两次相同的数字。

3 个答案:

答案 0 :(得分:2)

而不是&i,为什么不通过i并根据需要将其投回?您将相同的地址传递给所有线程。

答案 1 :(得分:0)

我不在Windows机器上,所以我无法测试这个,但在我编写的程序中,我创建了一个包含所有值的数组,并做了一个指向数组元素的指针(int numbers[100]; &number[i]) 。这个工作的原因是因为我在第二个线程运行时正在改变。

答案 2 :(得分:0)

改变这个:

&i

到此:

(void*)i

而且:

int count = *(int*)Param + 1

到此:

int count = ((int)Param) + 1;