我正在做一个小型大学项目,我将不同的多线程方法应用于模式匹配算法(pthread,omp)并将它们与它们各自的顺序实现进行比较。
目前它运行良好,并且根据算法和 gcc 优化,我的运行时间缩短了大约 2 - 3 倍。
现在,我也想使用 std::thread 来完成它,但是,根据我设法收集的信息,它们是在 Linux 上使用 Pthreads 实现的,所以我想知道这是否有任何意义。
我正在做一个小型大学项目,我将不同的多线程方法应用于模式匹配算法(pthread,omp)并将它们与它们各自的顺序实现进行比较。
目前它运行良好,并且根据算法和 gcc 优化,我的运行时间缩短了大约 2 - 3 倍。
现在,我也想使用 std::thread 来完成它,但是,根据我设法收集的信息,它们是在 Linux 上使用 Pthreads 实现的,所以我想知道这是否有任何意义。
std::thread
是 ISO C++ 标准语言提供的一项功能,因此它将在符合 C++11pthread
的平台和实现上可用,另一方面,它符合 IEEE 标准,因此不属于 C++ 标准的一部分。
因此,如果您的应用程序或多线程代码需要在各种平台上运行,那么使用它是有意义的,std::thread
这样它就可以在所有平台上正常工作,而无需任何修改。如果您不担心跨平台兼容性,那么使用pthread
s 就可以了。
这取决于。您可以对这两个 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
这也是你要走的路。
除了 Alok Save 关于可移植性的回答(这本身就是一个很大的优势)......
pthreads
是一个 C API,因此它不提供任何 RAII 包装器,这使得它更难使用且更容易出错,尤其是就异常安全而言(除非您编写了自己的包装器,您现在必须对其进行调试和维持)。
std::thread
et al 提供了经过良好测试的、异常安全的、现代的 C++ 包装器以及许多便利(例如,对 lambdas 的支持std::function
,std::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();
}