Win32 多线程资源

Posted

技术标签:

【中文标题】Win32 多线程资源【英文标题】:Resource for Win32 Multithreading 【发布时间】:2013-01-25 12:21:59 【问题描述】:

我正在寻找有关 Win32 上 C/C++ 的一些多线程资源的快速指针。我有兴趣比较使用单线程和多线程的数值计算的相对性能。这些问题不必是现实世界的,但它们不应该如此微不足道,以至于相对性能无关紧要。我的第一次尝试是实现 Eratosthenes 的单线程 Sieve 和 Atkin 的 Sieve,假设两者都有相对简单的多线程示例,但我找不到任何一个。 我不想成为多线程专家,但接受这需要一些努力,我已经为大约 30 小时的编程时间做了预算。我有 Russinovich 和 Solomon 的 Windows Internals 以及 Richter 和 Nasarre 通过 C/C++ 编写的 Windows 的副本,我很乐意购买其他书籍,但如果有免费资源,我更喜欢它们。

我想避免使用任何外部库,例如Boost 以使示例尽可能干净,以避免任何依赖问题。我不想去 CLR 附近的任何地方

上下文是我为 Excel 编写 dlls/xlls,因为 Excel 12 微软声称这些函数可以是多线程的,我想研究它是如何工作的。

我已经离开 Stack Exchange 一两年了,所以请保持温和。我对我发现的大部分内容都进行了一些探索,重点是理论而不是实现

【问题讨论】:

Eratosphenes 并行化很简单。您可能遇到的唯一问题是数据内存缓存,它与线程本身并不完全相关。所有与线程相关的 API 都在 MSDN 上进行了描述,并附有示例。 您使用的是 C++11 吗?如果是,您真的不需要外部库,因为线程直接集成在语言中。 感谢您的及时回复,看看 Eratosthenes 的筛子,瘫痪外环似乎没有什么好处,但内环可以分成奇偶对,但这需要锁定真/假数组,它可能支配使用 2 个线程的任何性能增益。考虑尝试多线程筛子的答案将是一项富有成效的编程练习,即使它不直接适用于我要解决的问题。另外我忘记了一条重要信息,我在 XP 5.1 服务包 3 上使用 Visual C++ 10 @phineas 您是在寻找有关多线程实现的知识,还是在寻找可以“并行化”的算法? 我知道您并不想使用外部库,但您可能还是想查看 OpenMP。您可能只需将#pragma omp parallel for 添加到您的代码中即可。 【参考方案1】:

关于 WinAPI 中的多线程调用的MSDN section 在这里可以提供帮助吗?还是您需要更多“类似教程”的东西?

有关步骤示例,请参阅 CreateThread 调用的文档引用的 MSDN 文章“Creating Threads”。

【讨论】:

我一直在寻找一些可以剪切和粘贴的代码,这样我就可以逐步理解它,但考虑到答案和 cmets,我认为我会从 MSDN 示例中受益。跨度> @phineas 我刚刚添加了指向 MSDN 文章“创建线程”的链接。在那里你会找到示例代码和解释。我希望这能加快你的研究速度:-)【参考方案2】:

在 Visual Studio 中,您可以激活 OpenMP 支持,然后很容易并行化循环或代码区域。您可以轻松找到教程,例如 here。

【讨论】:

OpenMP 是最容易使用的线程 API。如果您的问题可以这样处理,那么 OpenMP 就是您的最佳选择。

以上是关于Win32 多线程资源的主要内容,如果未能解决你的问题,请参考以下文章

win32多线程编程

win32多线程设计总结

win32API多线程编程

Win32 多线程编程

Win32多线程调用gdal库接口

win32线程