C++ 使用C/C+;创建多线程应用程序的最简单方法是什么+;?

C++ 使用C/C+;创建多线程应用程序的最简单方法是什么+;?,c++,multithreading,C++,Multithreading,使用C/C++创建多线程应用程序的最简单方法是什么?pthreads 用任何语言创建多线程应用程序都没有简单的方法。不幸的是,没有简单的方法。两个选项:linux上的pthread、windows上的win32 api线程或boost::thread library。Qt线程和Qt并发可能值得在谷歌上搜索。Qt有一个很好的解决方案 但正如其他人所警告的那样,这不适合初学者。我给自己的doc链接指向一个规范包括线程功能(我最喜欢的新功能之一)。很快,你编译什么操作系统就不重要了!只要看看创建一个新

使用C/C++创建多线程应用程序的最简单方法是什么?

pthreads


任何语言创建多线程应用程序都没有简单的方法。

不幸的是,没有简单的方法。两个选项:linux上的pthread、windows上的win32 api线程或boost::thread library。Qt线程和Qt并发可能值得在谷歌上搜索。

Qt有一个很好的解决方案 但正如其他人所警告的那样,这不适合初学者。我给自己的doc链接指向一个

规范包括线程功能(我最喜欢的新功能之一)。很快,你编译什么操作系统就不重要了!只要看看创建一个新线程并连接回创建者线程是多么容易:

#include <thread>
#include <iostream>

class SayHello
{
public:
    void operator()() const
    {
        std::cout<<"hello"<<std::endl;
    }
};

int main()
{
    std::thread t((SayHello()));
    t.join();
}
#包括
#包括
同学们打招呼
{
公众:
void运算符()()常量
{

Std::CUT> P>我在C++中工作了一段时间,我还没有看到线程支持,但我发现在简单的类中封装OS提供的服务,通常是Win32或是Win32,都非常有用,这些类可以获取锁,并在析构函数中释放它们,使它们的使用相当简单。
void operateOnSharedResource(SharableResource & foo) {
    MutexLock lock(foo.getMutex());
    // do stuff to foo
    // implicit call to MutexLock dtor performs release 
}
最终有很多像这样的简单技巧来简化线程编程,如果Boost现在还没有这样的东西,我会感到惊讶(编辑:它有,并且在中有文档记录)

无论如何,编写多线程代码的主要问题不会由任何第三方库来解决,这就是理解在哪里可以有效地并行化代码,在哪里可以触及共享资源,并且必须考虑这些资源。以下是我在编写多线程代码时使用的一些经验法则

  • 尽量减少共享资源的数量
  • 尝试将共享资源封装在使所有操作原子化的类包装器中
  • 使辅助线程尽可能简单

正确的封装确实能为编写更安全的多线程代码创造奇迹,因为看到的东西越少,具有竞争条件的东西就越少。

对此没有简单的答案。这在很大程度上取决于您希望从多线程、平台/编译器以及希望使用的线程模型中获得什么线程API有它的缺陷

正因为到目前为止还没有人提到它,OpenMP是许多现代主流编译器支持的另一个选项,旨在简化并发的使用。

仅提及它,因为它尚未被提及:一个支持OpenMP的编译器()

< P>我不确定最简单的,但是IMO最方便的线程库是POCO C++项目中包含的一个。对于预览,请看头文件。

< Posix线程非常好,它们也有很好的文档和教程。


虽然没有java线程那么简单,但仍然很好。

这完全取决于您正在做什么。如果您可以将您正在做的事情融入OpenMP,那么这就是方法。否则,您可能会想看看。TBB提供了几个您应该能够融入的工作流,但该库是双重许可的,您可能无法接受无论是许可证。如果OpenMP和TBB都不存在,那么您应该考虑操作系统的线程池能力。
在某些情况下,您可能需要咬紧牙关,使用Boost.Thread。如果是这样,您将想看看(即使您不使用C++0x,也值得一读:“导致问题的不是线程本身,而是通信。可变共享状态引入隐式通信,”第3页).

相对更容易,因为它是可移植的,有很好的文档记录,并且具有高级API,例如。

最简单的方法是避免/最小化可变共享状态


一旦你拥有了可变的共享状态,你就需要处理锁定,这是编写多线程程序的难点所在。

除了已经提到的之外,它是另一个流行的、广泛部署的C++框架,它提供了跨多个平台的线程封装。C++的风格不是现代的。写下并发程序的最简单的方法是不显式地使用线程。你想做什么?C++的下一个版本,亲切地称为C++ 0x,是线程处理工具:路克-这仍然不容易。你是指C,或者C++?它们是不同的语言。AD在C中不起作用,对于大多数C++程序员来说,Pthon可能是太低的级别。这不是真的。为任务选择正确的语言可以使多线程编程变得简单。我问到最简单的方法是多线程编程,使用一种简单的语言,它看起来很容易,但是它是最困难的编程探针之一。如果你认为自己足够聪明,能够实现正确的多线程,那你就大错特错了:多线程编程从来都不容易。不管支持程度如何,多线程编程的颠簸、旋转、死锁和所有其他陷阱都不容易克服。即使每种编写多线程的方法线程应用程序很难,根据定义,至少其中一个必须是最简单的。Pa只要你愿意忍受C++,无论如何,你现在可以在java中完成它,如果你想做这种情况。Dude…这个问题指定C++/杰姆斯。@除非最近发生了变化,否则我认为STD::线程不是现有的完全替代。像POSIX线程这样的实现,尤其是缺少线程优先级之类的特性。请参见下面的细节:……无论如何,不可否认的是:STD::线程将是对标准的一个非常受欢迎的添加。这是我认为没有帮助的,尤其是与Boost的推荐相比。POSIX不是EASI。