用c ++实现C ++线程库

时间:2009-02-11 06:29:27

标签: c++ multithreading

我是一名java程序员,但目前正在研究c ++语言。与java不同,c ++没有定义任何线程实用程序。在c ++中实现多线程应用程序对我来说有点困难。无论如何有人可以用c ++实现自己的线程库吗?你必须掌握汇编语言的一些概念吗?我在很多场合试图从操作系统特定的功能创建一个线程,但我一直都失败了。 有人可以帮忙吗?

7 个答案:

答案 0 :(得分: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库delivers。如果您想自己滚动,请在Windows上查看CreateMutexWaitForSingleObjectReleaseMutexCriticalSection函数,在unix上查看pthread_mutex_init

答案 1 :(得分: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接口,其用法与Java线程的用法相近(如果您实现Runnable,而不是扩展Thread):

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 ::方法的调用,并将其作为方法参数传递给它。

虽然这与Java的观点大不相同,但它也是最灵活的方法,因为您可以将线程模型与实际工作代码分离。无需适合特定的界面。这也是即将推出的标准线程接口。

答案 2 :(得分:3)

除了其他人提到过的图书馆外,还有英特尔的Threading Building Blocks。它是一个开放源代码(带链接例外的GPL2),来自英特尔的跨平台库。

答案 3 :(得分:1)

如果您使用的是POSIX系统,如Linux或Unix or even windows,则可以使用pthread

如果你被困在没有.NET的Windows机器上,我认为你没有太多选择,只能学习win32线程。当然,管上有很多“win32线程库”。

Boost

CodeProject

SourceForge

我怀疑大多数大型代码库都有某种自定义实现......

最简单的选择win窗口可能适用于更易于处理的.NET线程。 You can have Visual C++ .NET for free

答案 4 :(得分:1)

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

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

我有一个小C ++项目,这里有一个线程库。目的非常具体,但也许可以作为一个例子。

http://github.com/mikelikespie/reccage

答案 5 :(得分:0)

以下URL说明“与C ++无关的平台独立,多线程和同步库”

http://zthread.sourceforge.net/

祝你好运。

答案 6 :(得分:0)

另一个易于使用,独立于平台的并发HEADER ONLY库:

https://github.com/zlateski/zi_lib/tree/master/zi/concurrency/

示例位于测试目录