在C ++中实现线程的标准做法?

时间:2009-10-11 16:24:40

标签: c++ multithreading

我期待在未来几周内接受C ++的采访。 (yay)所以我一直在重新学习C ++并进行学习。不幸的是,我已经意识到我从未在C ++中实现线程,并且有点关注并发性测验。

据我所知,C ++在Linux中使用pthread,在Windows中使用其他一些设备。它是否正确?还有其他行业标准,更多的OO方式来处理我应该知道的C ++中的线程吗?您是否有任何好的网络资源可以指导我在C ++中练习和学习线程?

谢谢!

7 个答案:

答案 0 :(得分:9)

有一个boost threads库可能是最接近标准的。

通常,线程由操作系统提供,因此您可以获得操作系统提供的任何内容。人们首先接触线程通常是在GUI中,以允许后台计算不阻止GUI,因此人们倾向于使用特定GUI框架(MFC / Qt等)提供的线程函数

答案 1 :(得分:5)

目前C ++完全不知道线程存在。不同的操作系统提供了线程库以使其可用。 C ++的下一个版本,即所谓的C ++ 0x,将成为一个线程库标准。如果我今天要启动一个多线程的应用程序,我会使用boost线程或者我可能正在使用的任何软件包的一部分的线程,即QT或WxWidgets。

答案 2 :(得分:2)

好吧,直到C ++ 0x到此为止,没有标准的方法在C ++中进行线程化。您可以使用操作系统提供的任何功能。所以是的,如果您使用的是类UNIX操作系统,则可以使用pthreads。在Windows上,您可以使用Windows API。

有第三方工具包试图提供统一且可移植的线程API,例如提升线程和QT。

编写自己的可移植抽象层也不难。我们这样做是因为boost API没有几年前我们需要的所有内容(例如无法设置优先级)。

答案 3 :(得分:1)

在windows中,创建线程的唯一方法是使用win32 API。您在Windows上创建线程的每个库最终都使用win32 CreateThread()

QT Contains a nice C++包装跨平台的线程。通常一个好的做法是拥有一个MyThread类,其中包含设置线程,检查错误代码,获取退出代码等所有细节。 MyThread类将有一个名为run()的纯虚函数,用于实际执行您希望线程执行的任何操作。 MyThread类的用户应该从它继承并实现run(),这样您就可以将类的用户与实际创建线程的细节隔离开来。

MyThead还需要一个方法start()来启动线程。该线程将从类中的某个入口点开始(这通常需要是一个静态方法),然后这最终会导致调用用户的run()方法。

答案 4 :(得分:1)

除了Qt,wxWidgets,Boost和原生的操作系统提供的线程工具之外,你可以只使用Google来获取C ++的线程库。它们可能更便携,更轻便(如果您正在寻找的是线程)。但是,如果您需要更多设施并且上述库提供它们,那么请继续使用它们。 Boost特别好,它还有其他设施,但不可否认,正如Brian Neal所说,它的线程库在某些方面是有限的。

答案 5 :(得分:1)

对于你的面试,无论是提升还是qt都没有帮助。你可以将它们用作高级库和接口,没有人会问你如何在这样的访谈中使用boost或qt。 要了解线程和互斥等,请参阅http://code.google.com/p/effoaddon/downloads/list中名为EffoAddons.pdf的文档。

Raw source 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/thrd/src/thrd/thrd.cpp,
 high level abstract interface 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/thrd/include/thrd_i.h,
 and code support wait and signal 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/queue/include/iqb_ops_i.h.

你最好学习一些基础知识,而不仅仅是高级接口,尽管写C ++。

答案 6 :(得分:0)

我已经看到了几个使用C ++进行线程的“真实世界”实现,并且它们都是由某人编写Thread类来包装底层O / S API而实现的

例如,在Windows上有一个CreateThread API:您的Thread类会将其this值传递给void* lpParameter API的CreateThread参数;以及LPTHREAD_START_ROUTINE,您实现为Thread类的私有静态方法,然后需要将void*强制转换回Thread*' in order to get the Thread`实例。