如何使用C/C++最简单地创建多线程应用程序?
如何使用C/C++最简单地创建多线程应用程序?
在任何语言中创建多线程应用程序都没有简单的方法。
很遗憾,没有简单的方法。几个选项:在Linux上使用pthread,在Windows上使用win32 api线程或boost::thread库。
提一下,因为之前没有提到:需要支持OpenMP的编译器(http://openmp.org/wp/)。
没有简单的答案。这取决于您希望从多线程中获得什么,平台/编译器以及要使用的线程模型。每个线程API都有其缺陷。
而且仅仅因为迄今为止没有人提到它,OpenMP是另一种选择,它在许多现代主流编译器中得到支持,旨在简化并发使用。 http://openmp.org/wp/
我已经有一段时间没有使用C++了,也没有接触过Boost线程支持,但是我发现将操作系统提供的信号量服务封装在简单的类中非常有用,通常这些服务由POSIX或Win32提供,这样可以在类中获取锁,并在析构函数中释放它们,使得使用变得相当简单。
void operateOnSharedResource(SharableResource & foo) {
MutexLock lock(foo.getMutex());
// do stuff to foo
// implicit call to MutexLock dtor performs release
}
最终,有很多简单的技巧可以使线程编程更加轻松,如果Boost现在没有类似的东西(编辑:它有,并且在锁类型中有文档),我会感到惊讶。
尽管如此,编写多线程代码的主要问题不会被任何第三方库解决,这就是理解您的代码在哪里可以有用地并行化以及在哪里会涉及共享资源并且必须加以考虑的问题。以下是我在编写多线程代码时使用的一些经验法则:
适当的封装确实可以为编写更安全的多线程代码带来奇迹,因为您能看到的东西越少,竞争条件就越少。
C++0x规范包括线程功能(这是我最喜欢的新特性之一)。很快,无论您编译哪个操作系统,都不会有问题!看看创建新线程并返回到创建者线程有多简单:
#include <thread>
#include <iostream>
class SayHello
{
public:
void operator()() const
{
std::cout<<"hello"<<std::endl;
}
};
int main()
{
std::thread t((SayHello()));
t.join();
}
Visual Studio 2010正在实现C++0x的部分功能,但我们仍在等待线程工具。