65.9K
CodeProject 正在变化。 阅读更多。
Home

跨平台线程

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.19/5 (12投票s)

2006年10月16日

CPOL

2分钟阅读

viewsIcon

53337

downloadIcon

589

一个跨平台线程类。

引言

在编写针对 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.hXPThreads.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”,可以在你的应用程序中单独使用。

© . All rights reserved.