跨平台线程






2.19/5 (12投票s)
一个跨平台线程类。
引言
在编写针对 Windows 和任何类 Unix 操作系统(OS)的跨平台应用程序时,处理不同类型的线程可能会很复杂。线程有两种类型:分离的和可连接的。POSIX 线程 API 支持可连接和分离线程,而 Win32 多线程 API 仅支持可连接线程。
POSIX 线程在所有基于 Unix 的平台上可用(MAC、Linux 等),但 Microsoft Windows 本身并不原生支持它们。有一些开源替代方案可以为 Win32 环境模拟 POSIX 线程,例如 pthreads-win32。
可连接线程和分离线程之间的根本区别在于,可以等待可连接线程,而不能等待分离线程。需要等待可连接线程,否则它使用的系统资源将永远无法释放。相反,你只需要启动一个分离线程,它就会自行终止。
XPThreads
类提供了一个简单的接口来生成新线程,同时隐藏了使用不同线程包所涉及的复杂性。在内部,XPThreads
为 Windows 使用可连接线程(唯一可能的线程),为基于 Unix 的操作系统使用分离线程(POSIX 线程)。如果需要,代码可以轻松地进行调整,以便在基于 Unix 的操作系统上使用可连接线程。
背景
这是我在 CodeProject 上的第一篇文章。我在开发一个跨平台插件时遇到了提供多线程支持的需求。一种替代方案是使用一些笨重的外部线程包,但我对此并不倾向;因此,我决定编写我自己的跨平台线程类。
我已经在 Macintosh 和 Windows 上测试了这个类,但我坚信它应该可以在任何基于 Unix 的操作系统上正常工作。
使用代码
使用 XPThreads
类很简单。
你需要将 XPThreads.h 和 XPThreads.cpp 添加到你的项目工作区,并在需要生成新线程的源文件中包含 XPThreads.h 文件。
下一步是创建一个线程回调函数。此函数应该是一个全局函数或静态类成员函数。它应严格遵循以下函数原型
unsigned long Entry (void* param) { cout<<"In the thread" << endl; return NULL; }
第二步是创建一个新的 XPThreads
对象,并为其提供线程入口过程的函数地址。这可以通过以下两种方式完成,如下所示
在构造函数中
XPThreads* ptrThread = new XPThreads(Entry); ptrThread->Run(); delete ptrThread;
或者
XPThreads* ptrThread = new XPThreads(); ptrThread-> SetThreadProc(Entry); ptrThread->Run(); delete ptrThread;
最后一步是使用新创建的 XPThreads
对象调用 Run()
。
下载次数
演示项目
演示项目包括 Windows 和 Macintosh 平台的项目文件以及源代码。它演示了如何在 Macintosh 和 Windows 上使用 XPThreads
。
源文件
源代码包括“XPThreads.h”和“XPThreads.cpp”,可以在你的应用程序中单独使用。