使用C / C ++创建多线程应用程序的最简单方法是什么?
答案 0 :(得分:14)
答案 1 :(得分:13)
以任何语言创建多线程应用程序没有 easy 方式。
答案 2 :(得分:8)
仅提及它,因为它没有被提及:具有OpenMP支持的编译器(http://openmp.org/wp/)
答案 3 :(得分:7)
Qt很漂亮 threading support and documentation 但正如其他人警告的那样,这不适合初学者。我给自己的文档链接指向short reading list
答案 4 :(得分:5)
答案 5 :(得分:5)
对此没有简单的答案。它在很大程度上取决于您希望从多线程,平台/编译器以及您想要使用的线程模型中获得什么。每个线程API都有其缺陷。
仅仅因为到目前为止还没有人提到它,OpenMP是许多现代主流编译器支持的另一种选择,旨在简化并发的使用。 http://openmp.org/wp/
答案 6 :(得分:3)
我用C ++工作已经有一段时间了,我没有看到Boost线程支持,但我发现封装操作系统提供的semaphore服务非常有用,通常都是{{ 3}}或Win32,在获取锁的简单类中,并在析构函数中释放它们,使它们的使用相当简单。
void operateOnSharedResource(SharableResource & foo) {
MutexLock lock(foo.getMutex());
// do stuff to foo
// implicit call to MutexLock dtor performs release
}
最终有很多这样的简单技巧可以简化线程编程,如果Boost现在没有这样的东西我会感到惊讶(编辑:它的确如此,它记录在POSIX中)。
无论如何,编写多线程代码的主要问题不是由任何第三方库解决,而是理解代码可以在哪里有用并行化,以及共享资源将被触及的位置,必须是占了。以下是我在编写多线程代码时使用的一些经验法则。
正确的封装确实为编写更安全的多线程代码创造了奇迹,因为您可以看到的东西越少,竞争条件就越少。
答案 7 :(得分:2)
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的一部分,但我们仍在等待线程设施。
答案 8 :(得分:2)
我不确定最简单的,但是IMO是用户友好最多的线程库,是Poco C ++项目中包含的。要预览,请查看Thread.h标题文件。
答案 9 :(得分:2)
Boost.Thread相对容易,因为它可移植,文档齐全,并且具有高级API,例如scoped_try_lock。
答案 10 :(得分:2)
除了已经提到的那些,ACE是另一个流行且广泛部署的C ++框架,它提供跨多个平台的线程封装。例如,它的C ++风格并不像Boost.Thread那样现代,但它已经非常成熟。
答案 11 :(得分:1)
我会说Qt。 Qt Threads和Qt Concurrency可能值得用Google搜索。
答案 12 :(得分:1)
Posix Thread相当不错,它们还附带了很棒的文档和教程。
不像java线程那么容易,但仍然相当不错。
答案 13 :(得分:1)
这完全取决于你正在做什么。如果你能够将你正在做的事情融入OpenMP,那么这就是你要走的路。否则你可能想看看Intel's TBB。 TBB提供了几个您应该能够适应的工作流程,但是该库是双重许可的,您可能无法接受任何许可证。如果OpenMP和TBB都已用完,那么您应该考虑操作系统的线程池功能。
在某些时候,您可能需要咬紧牙关并使用Boost.Thread。如果是这样,你会想看看what makes multithreading in C++ hard(即使你没有使用C ++ 0x也很好阅读:“这不是线程本身,而是导致问题的通信。可变共享状态引入隐含沟通,“第3页。”
答案 14 :(得分:1)
最简单的方法是避免/最小化可变共享状态。
一旦你有可变的共享状态,你需要处理锁定,这是编写多线程程序的主要困难所在。