C++ 如果我在Linux上有Pthread代码,那么在std::thread中实现相同的代码是否有优势?

C++ 如果我在Linux上有Pthread代码,那么在std::thread中实现相同的代码是否有优势?,c++,multithreading,c++11,pthreads,stdthread,C++,Multithreading,C++11,Pthreads,Stdthread,我正在做一个小的大学项目,我将不同的多线程方法应用于模式匹配算法pthread,omp,并将它们与各自的顺序实现进行比较 目前它运行良好,根据算法和gcc优化,我的运行时间缩短了约2-3倍 现在,我也希望使用STD::线程,但是,从我所收集到的,它们是在Linux上使用p螺纹实现的,所以我想知道是否有任何点。 STD::线程是由ISO C++标准语言提供的一个特性,因此,它将在符合C++ 11的平台和实现上使用,而PthObl则遵循IEEE标准,因此不属于C++标准的一部分。p> 因此,如果您

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

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

现在,我也希望使用STD::线程,但是,从我所收集到的,它们是在Linux上使用p螺纹实现的,所以我想知道是否有任何点。

STD::线程是由ISO C++标准语言提供的一个特性,因此,它将在符合C++ 11的平台和实现上使用,而PthObl则遵循IEEE标准,因此不属于C++标准的一部分。p> 因此,如果您的应用程序或多线程代码需要在各种平台上运行,那么使用std::thread是有意义的,这样它就可以像在所有平台上一样工作,而无需任何修改。如果您不担心跨平台兼容性,那么您对PXTLY就很好了。

STD::线程是ISO C++标准语言提供的一个特性,因此它将在符合C++ 11的平台和实现上使用,而PthObl则是遵循IEEE标准,而不是C++标准的一部分。p>


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

除了Alok Save关于可移植性的回答之外,可移植性本身就是一大优势

pthreads是一个C-API,因此它不提供任何RAII包装,这使得它更难使用和更容易出错,特别是在异常安全方面,除非您编写自己的包装,现在您必须调试和维护它

STD::线程提供了良好的测试、异常安全、现代C++包装以及许多便利性。例如支持LAMBDAS、STD::函数、STD::绑定,…这使得它更容易和更安全地使用。例如,使用pthreads编写和调试此代码要痛苦得多:


除了Alok Save关于可移植性的回答,可移植性本身就是一大优势

pthreads是一个C-API,因此它不提供任何RAII包装,这使得它更难使用和更容易出错,特别是在异常安全方面,除非您编写自己的包装,现在您必须调试和维护它

STD::线程提供了良好的测试、异常安全、现代C++包装以及许多便利性。例如支持LAMBDAS、STD::函数、STD::绑定,…这使得它更容易和更安全地使用。例如,使用pthreads编写和调试此代码要痛苦得多:


视情况而定。您可以对这两个API执行相同的操作,但是:

pthreads是POSIX的一部分,因此在几乎任何*nix操作系统上都可以使用,但在Windows上不是本机的。 p螺纹是一个C API:您可以很容易地从C代码调用它,但是它没有利用C++特性来使API更安全。 STD::线程是标准的C++ API。它不是语言外部的一个单独的规范的一部分,就像pPosits是POSIX的一部分,而不是C或C++。因此,在任何一个平台上都有可用的,它包括一个包含*nix和Windows的现代C++编译器。 STD::线程是C++ API,所以不能从C调用它,但是另一方面,使用起来更容易更安全。它大量利用RAII来确保资源在超出范围时得到清理,并且它允许您从函数对象创建线程,并具有所提供的所有灵活性,而不是受限于C风格的自由函数。
这要看情况而定。如果您希望代码从C和C++中使用,您可能希望使用p螺纹。另一方面,如果它是C++,并且希望它不管OS运行,那么STD::线程是可取的。如果你只想写出好的C++代码,那么STD::线程也是这样。您可以对这两个API执行相同的操作,但是:

pthreads是POSIX的一部分,因此在几乎任何*nix操作系统上都可以使用,但在Windows上不是本机的。 p螺纹是一个C API:您可以很容易地从C代码调用它,但是它没有利用C++特性来使API更安全。 STD::线程是标准的C++ API。它不是语言外部的一个单独的规范的一部分,就像pPosits是POSIX的一部分,而不是C或C++。因此,在任何一个平台上都有可用的,它包括一个包含*nix和Windows的现代C++编译器。 STD::线程是C++ API,所以不能从C调用它,但是另一方面,使用起来更容易更安全。It uti 对RAII进行了大量的LIZE,以确保资源在超出范围时得到清理,并且它允许您从函数对象创建线程,并提供所有的灵活性,而不是局限于C风格的自由函数。 这要看情况而定。如果您希望代码从C和C++中使用,您可能希望使用p螺纹。另一方面,如果它是C++,并且希望它不管OS运行,那么STD::线程是可取的。如果你只想写出好的C++代码,那么STD::线程也是这样。

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();
}