1

我正在做一个小型大学项目,我将不同的多线程方法应用于模式匹配算法(pthread,omp)并将它们与它们各自的顺序实现进行比较。

目前它运行良好,并且根据算法和 gcc 优化,我的运行时间缩短了大约 2 - 3 倍。

现在,我也想使用 std::thread 来完成它,但是,根据我设法收集的信息,它们是在 Linux 上使用 Pthreads 实现的,所以我想知道这是否有任何意义。

4

3 回答 3

4

std::thread是 ISO C++ 标准语言提供的一项功能,因此它将在符合 C++11pthread的平台和实现上可用,另一方面,它符合 IEEE 标准,因此不属于 C++ 标准的一部分。

因此,如果您的应用程序或多线程代码需要在各种平台上运行,那么使用它是有意义的,std::thread这样它就可以在所有平台上正常工作,而无需任何修改。如果您不担心跨平台兼容性,那么使用pthreads 就可以了。

于 2013-10-06T13:20:53.837 回答
4

这取决于。您可以对这两个 API 执行相同的操作,但是:

  • pthreads 是 POSIX 的一部分,因此,几乎可以在任何 *nix 操作系统上使用,但在 Windows 上(本机)不可用。
  • pthreads 是一个 C API:您可以轻松地从 C 代码中调用它,但它没有利用 C++ 特性使 API 更好/更安全地使用
  • std::thread是一个标准的 C++ API。它不是语言之外的单独规范的一部分(就像 pthreads 是 POSIX 的一部分,而不是 C 或 C++ 的一部分)。因此,它可在任何具有现代 C++ 编译器的平台上使用(包括 *nix 和 Windows)
  • std::thread是一个 C++ API,所以你不能从 C 中调用它 --- 但另一方面,它使用起来更容易、更安全。它大量使用 RAII 来确保资源超出范围时得到清理,并且它允许您从函数对象创建线程,具有所有灵活性,而不是受限于 C 风格的自由函数.

所以这取决于。如果您希望在 C 和 C++ 中使用您的代码,您可能希望坚持使用 pthread。另一方面,如果它只是 C++,并且您希望它在任何操作系统下都能正常工作,那么std::thread它是更可取的。如果你只是想写出漂亮的C++ 代码,std::thread这也是你要走的路。

于 2013-10-06T13:50:31.107 回答
2

除了 Alok Save 关于可移植性的回答(这本身就是一个很大的优势)......

pthreads是一个 C API,因此它不提供任何 RAII 包装器,这使得它更难使用且更容易出错,尤其是就异常安全而言(除非您编写了自己的包装器,您现在必须对其进行调试和维持)。

std::threadet al 提供了经过良好测试的、异常安全的、现代的 C++ 包装器以及许多便利(例如,对 lambdas 的支持std::functionstd::bind...),使其更易于使用和更安全。例如,使用以下代码编写和调试此代码会更加痛苦pthreads

std::mutex m;

struct ThreadClass {
    ThreadClass(int p1, int p2, int p3)
        : t(std::bind(&ThreadClass::run, this, p1, p2, p3))
    // notice how I'm binding to a member function, not a static one
    // additionally I'm also binding additional parameters, which
    // avoids using member variables
    {}
    void run(int p1, int p2, int p3) {
        {
            auto l = std::lock_guard<std::mutex>(m);
            // do something while locked
            // the lock will be automatically released when you
            // exit the scope, no matter how (including return and throw)
        }
        // continue unlocked
    }
    std::thread t;
}

void fireAndForget(int param) {
    std::thread t([=]() {
            // do something with param (captured by the lambda)
        });
    t.detach();
}
于 2013-10-06T13:41:00.350 回答