【问题标题】:Windows C++ Thread Parameter PassingWindows C++ 线程参数传递
【发布时间】:2011-08-04 23:18:04
【问题描述】:

在 Windows c++ 中,以下创建一个线程:

CreateThread(NULL, NULL, function, parameter, NULL, &threadID);

这将在新线程中运行“函数”并将“参数”作为 void* 或 LPVOID 传递。

假设我想将两个参数传递给“函数”,除了创建一个包含两个变量的数据结构然后将数据结构转换为 LPVOID 之外,还有更好看的方法吗?

【问题讨论】:

    标签: c++ windows multithreading function-pointers


    【解决方案1】:

    不,这是唯一的方法。只需使用 2 个数据成员创建一个结构并将其传递为 void*

    【讨论】:

    • 你确定吗?这样做似乎很丑陋。
    • void* 作为参数背后的想法是这样您就可以做到这一点,并且系统不会妨碍您。你的代码知道两边的参数是什么,但系统不必知道。
    • @ross 它有什么难看的?请记住,您必须提供 C 接口。你有什么更好的解决方案?
    • 从技术上讲,void* 不需要包含指针数据,因此您可以使用union thread_params { void* as_ptr; struct { short a, b; } as_fields; };,但这更丑陋且风险更大。只需将参数放入结构中并将指针传递给结构即可。如果您愿意,您甚至可以模板化实现,或者使用为您执行此操作的库。
    【解决方案2】:

    这是将参数传递给线程的标准方法,但是您的新线程无法访问进程中的任何内存,因此只要您提供难以传递的内容或大量数据,就可以作为共享资源访问适当的同步控制。

    【讨论】:

      【解决方案3】:

      我认为有一个更好的方法,我一直在我的嵌入式代码中使用它。它实际上源于将成员方法传递给与 CreateThread() 非常相似的函数的愿望。之所以需要,是因为该类已经将线程代码所需的所有参数作为成员数据(使用适当的设置器)。 I wrote up a more detailed explanation 有兴趣可以参考。在文章中,您看到 OSTaskCreate(),只需在脑海中替换 CreateMethod()。

      【讨论】:

      • 2016 年 12 月 13 日,链接似乎已损坏。请问你能修好吗? @Tod
      • 我看看能不能得到我写的东西的副本。那个 wiki 属于 NetBurner,他们仍然在做生意并且很强大,所以我不确定他们为什么要关闭 wiki。自从我加入 Pluralsight 以来,我还没有做过嵌入式工作。我在他们的论坛上问过,员工看到它可能需要一段时间。
      • @Andiana Netburner 好心地在假期恢复了 wiki,这样我就可以得到文章了。我将感兴趣的页面复制到 wikia 页面并更新了链接以指向该页面上应该感兴趣的位置。
      【解决方案4】:
      #include <windows.h>
      #include <stdio.h>
      
      struct PARAMETERS
      {
          int i;
          int j;
      };
      
      DWORD WINAPI SummationThread(void* param)
      {
          PARAMETERS* params = (PARAMETERS*)param;
          printf("Sum of parameters: i + j = \n", params->i + params->j);
          return 0;
      }
      
      int main()
      {
          PARAMETERS params;
          params.i = 1;
          params.j = 1;
      
          HANDLE thdHandle = CreateThread(NULL, 0, SummationThread, &params, 0, NULL);
          WaitForSingleObject(thdHandle, INFINITE);
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 1970-01-01
        • 2015-04-17
        • 2015-03-21
        • 2012-06-25
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多