C++ 使用win32api创建并行线程

C++ 使用win32api创建并行线程,c++,winapi,parallel-processing,C++,Winapi,Parallel Processing,问题是: 我有两个稀疏矩阵,被描述为三元组向量。 任务是使用win32api并行处理为它们编写乘法函数。因此,我需要知道如何: 1) 在win32api中创建一个线程 2) 为它传递输入参数 3) 获取返回值 提前谢谢 编辑:将“进程”改为“线程”那么,您的问题的答案是CreateProcess和GetExitCodeProcess 但问题的解决方案根本不是另一个过程,而是更多的线程。与创建自己的线程相比,OpenMP可能是一种更合适的机制 如果必须将Win32 API直接用于线程,则该过程类似

问题是: 我有两个稀疏矩阵,被描述为三元组向量。 任务是使用win32api并行处理为它们编写乘法函数。因此,我需要知道如何:

1) 在win32api中创建一个线程

2) 为它传递输入参数

3) 获取返回值

提前谢谢


编辑:将“进程”改为“线程”

那么,您的问题的答案是
CreateProcess
GetExitCodeProcess

但问题的解决方案根本不是另一个过程,而是更多的线程。与创建自己的线程相比,OpenMP可能是一种更合适的机制

如果必须将Win32 API直接用于线程,则该过程类似于:

  • 通过分配一些内存、存储指向实际数据的指针、该线程将要处理的内容的索引等来构建工作项描述符。使用一种结构来保持这种组织
  • 调用
    CreateThread
    并传递工作项描述符的地址
  • 在线程过程中,将指针转换回结构指针,访问工作项描述符,并处理数据
  • 在主线程中,调用
    WaitForMultipleObjects
    以加入工作线程

为了获得更高的效率,您可以使用Windows线程池并调用
QueueUserWorkItem
。但是,虽然您不必自己创建线程,但随后需要事件句柄将任务连接回主线程。我怀疑的代码量差不多。

并行进程还是线程?线程,你是对的。除非矩阵真的很大,否则线程加速的开销将超过好处。更重要的是,如果你关心性能,如果你想将两个矩阵相乘,你应该使用三元组以外的格式。@davidheffernanskyline+OpenMP,我想。但这个案例是为了研究。是的,OpenMP是一种更好的方法,我以前用过好几次。但是我在这个例子中使用Win API是因为一些原因(导师这么说的:))所以,你能解释一下我如何启动线程吗?好的,
CreateThread
将比单独的进程简单得多。非常感谢。我应该如何避免等待所有线程?就像我有100多个任务和4个可用线程,所以我希望每个线程在不等待其他线程的情况下执行下一个任务。@PavelOganesyan如果你将已知大小矩阵相乘,我将确定机器上的核心数,计算出每个线程(一个预核心)将处理的板数,为每个线程设置适当的数据结构以获得工作分配,然后将它们全部触发,如果有剩余,当前线程将获取模数,然后等待所有线程通过WaitForMultipleObjects完成,就完成了。在web上,甚至在其他网站上,都有一些这样做的示例。如果操作正确,则不需要锁。@mk1:因为OpenMP更易于使用,对于它设计用来解决的问题类型来说。这个问题正是OpenMP设计用来解决的(迭代处理,需要在多个线程之间分割循环)。您希望在其他情况下显式使用线程,例如长时间运行的后台任务,这些任务根本不适合OpenMP。对于并行网络I/O,您应该使用工作项和线程池,因为OpenMP不适合,显式线程需要非常复杂的管理。