【问题标题】:C++ most common parallel processing method. Pthreads? [closed]C++最常见的并行处理方法。线程? [关闭]
【发布时间】:2017-09-16 17:39:41
【问题描述】:

只需要对 C++ 上的并行处理方法有所了解。到目前为止,我在并行化方面的工作一直在 C 上,其中主要方法是使用 pthreads。

不过,我也使用过 openMP 和 cilkPlus。

我只是想问一下,C++中并行化代码的常用方法是什么? pthreads被认为是一个好还是坏的实现?我应该继续在 C++ 中使用它们吗?

【问题讨论】:

  • 开始 c++11 的 stl 库中有一个标准线程包,您可以使用它来代替 pthreads。或者您可以继续使用 pthreads。
  • 我认为这可能过于宽泛且基于意见,因为不同的技术适用于不同的情况。但是C++ 现在有一个标准线程库,它一定会很流行。 pthreads 是一个很好的实现,但它没有利用标准的 C++ 技术来提供异常安全和 RAII 资源管理等功能。
  • 在 Windows 和其他一些操作系统的情况下,有 WaitForMultipleObjects 或类似的东西。这需要使用 Windows 本机线程或进程。 Linux 不包含等效功能,需要某种解决方法。

标签: c++ parallel-processing pthreads


【解决方案1】:

C++ 在其标准库中的不同抽象层提供并发性。

线程的最底层方法是将 std::thread 与同步类 std::mutex、std::unique_lock、std::condition_variable 等结合使用。此外,还支持原子操作(compare_exchange_weak/strong , fetch_add 等),包括像栅栏这样的内存排序工具。

下一个更高级别的抽象使用 std::async、std::future 和 std::promise。在这里不必自己控制多个线程,只需专注于任务的执行,这些任务可能是顺序的或并行的,只要在特定情况下最适合。实现甚至可以自行决定何时并行工作。

最后,在 C++17 中,存在内部使用并发的已知顺序 STL 算法的并发实现,例如 std::for_each 和行为类似于 std::accumulate 的 std::reduce。这与尚未出现的功能(例如协程、范围和执行上下文)相结合,可以产生非常健壮、高性能且特别易读的代码。

总之,有几个便携式工具可用于 C++ 中的并行编程。与编程中的所有事情一样,应该使用可以得到的最抽象的工具,以防止处理与实际问题无关的细节。因此,除非有充分的理由,否则我不会再在 C++ 中使用 pthread。

【讨论】:

    【解决方案2】:

    作为首选,除非您的需求更复杂,否则请使用std::threadstd::mutexstd::condition_variable

    在此处查看文档:

    http://en.cppreference.com/w/cpp/header/thread

    http://en.cppreference.com/w/cpp/header/mutex

    http://en.cppreference.com/w/cpp/header/future

    http://en.cppreference.com/w/cpp/header/condition_variable

    标准线程工具并不出色,也不是最先进的,但对于大多数任务它们足够好 - 当然可以替代 pthreads。

    std:: 构造的优势在于,即使优化器将加载和存储重新排序作为其 as-if pass 的一部分,也可以保证共享数据更改的可见性是正确的。

    如果您的需求更复杂,那么构建并发工具或使用基于它们构建的库是一个好主意。

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多