在C++中实现一个线程库

4

我是一名Java程序员,但目前正在使用C++语言工作。与Java不同,C++没有定义任何线程实用程序。对我来说,在C++中实现多线程应用程序有点困难。有没有办法使用C++实现自己的线程库?必须掌握一些汇编语言的概念吗?我曾经在许多场合尝试从操作系统特定的功能创建线程,但我总是失败了。有人能帮忙吗?

7个回答

8

考虑到您的专业水平,也许Boost Threads会有帮助?

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

当然,您可以实现自己的线程库。您不需要了解任何汇编语言来这样做,但是没有C标准库函数可以帮助您,您将需要使用特定于操作系统的库。例如,在Windows上,您可以使用 beginthreadex CRT函数,该函数最终调用 CreateThread Win32系统调用,但在许多Unix上,您将使用 pthread_create

除了启动线程之外,您可能还需要一些同步原语,Boost库在这方面 也提供了。 如果您想自己编写,请在Windows上查看 CreateMutexWaitForSingleObjectReleaseMutexCriticalSection函数,在Unix上查看pthread_mutex_init


6
我建议您使用现有的跨平台库,如Boost、ACE、POCO、QT等。ACE具有相当多的线程类,其中最简单易用的可能是ACE_Task_Base。您可以从中继承并提供int svc()方法的实现。这就是在您激活线程时调用的方法。
class WorkerThread : public ACE_Task_Base
{
public:
   int svc() { ... }
};
int main()
{
   WorkerThread worker;
   worker.activate();
   worker.wait();
}

使用POCO时,您需要使用Runnable接口,其用法与实现Runnable(而不是扩展Thread)的Java线程非常相似:
class Worker : public Poco::Runnable { ... };
int main() 
{ 
   Worker worker;
   Poco::Thread thr;
   thr.start( worker );
   thr.join();
}

Boost线程(建议使用)与众不同。它不是通过实现/扩展接口来实现,而是依赖于定义了operator()的对象。您可以创建一个线程并将一个实现了operator()()方法的对象传递给它。线程会通过调用该方法来启动。好处是,它非常容易与boost::bind结合使用,创建一个虚拟的函数对象(实现了operator())。
class X { public: void method( int argument ); }
int main()
{
   X x;
   boost::thread thr( boost::bind( &X::method, &x, 100 ) );
   thr.join();
}

该代码片段将创建一个类型为X的对象。使用bind,您可以创建一个函数对象,将调用应用于对象x上的方法X :: method,并将其传递100作为方法参数。
尽管这与Java的观点最不同,但也是最灵活的方法,因为您可以将线程模型与真实工作代码解耦。无需适应特定接口。这也是即将推出的标准线程接口。

3
除了其他人提到的库,还有英特尔的Threading Building Blocks。这是一款来自英特尔的开源(GPL2与链接例外),跨平台库。

最好至少查看一下文档,因为其中很多想法都非常有用。 - Anonymous

1

1

如果你使用像Linux或Unix这样的POSIX系统甚至是Windows, 你可以使用pthread。

如果你卡在没有.NET的Windows机器上,我认为你别无选择,只能学习win32线程。当然,在管道中有大量的“win32线程库”可供使用。

Boost

CodeProject

SourceForge

我猜测大多数大型代码仓库都有一些自定义实现...

在Windows上最容易的选择可能是使用.NET线程,它们更容易处理。 你可以免费获得Visual C++ .NET


1

在 C++ 中可以使用 Pthreads。我通常只是编写一些简单的包装器。

另外,如果您只是想分解一堆低级循环,请尝试使用 OpenMP。它非常容易使用。

我有一个小的 C++ 项目,其中包含一个线程库。目的非常具体,但它可能作为一个示例。

http://github.com/mikelikespie/reccage


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接