【问题标题】:Passing a parameter to threads in a loop将参数传递给循环中的线程
【发布时间】:2012-10-22 22:44:04
【问题描述】:

我需要创建 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

似乎线程号是随机的。但无论如何,同一个数字不应该出现两次。

【问题讨论】:

    标签: c multithreading winapi


    【解决方案1】:

    而不是&amp;i,为什么不直接传递i 并根据需要将其转换回?您将相同的地址传递给所有线程。

    【讨论】:

    • +1 使用指针来存储这个int 参数是一个聪明的主意。我在想malloc
    • 因为我忘记了指针可以存储整数,这就是为什么你会赞成这个想法。
    • 我认为问题不在于 at &i。在教授向我们展示的几个演示代码中,这是她“正确”的传递方式。
    • @user1766777 有时教授不知道 s#!+。你最终会弄清楚的。您不会将相同的地址传递给不同的线程,如果这样做 - 您不应该期望不同的线程在该地址看到不同的值。
    • hw.c(59) : 警告 C4022: 'CreateThread' : 实际参数 4 的指针不匹配
    【解决方案2】:

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

    【讨论】:

    • 我用你的方法解决了问题。现在它工作正常。谢谢!
    【解决方案3】:

    改变这个:

    &i
    

    到这里:

    (void*)i
    

    还有这个:

    int count = *(int*)Param + 1
    

    到这里:

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

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 2016-12-16
      • 1970-01-01
      • 2015-03-08
      • 2014-01-05
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多