我正在做一个小小的大学项目,在这个项目中,我将不同的多线程方法应用于模式匹配算法(p线程,omp),并将它们与各自的顺序实现进行比较。
目前,它运行良好,根据算法和gcc的优化,我的运行时间缩短了大约2-3倍。
现在,我也想使用std::线程来完成它,但是,从我所收集到的信息来看,它们是使用Linux上的P线程实现的,所以我想知道这是否有任何意义。
发布于 2013-10-06 13:20:53
std::thread是C++标准语言提供的一个特性,因此它可以在符合C++11的平台和实现上使用,而pthread则遵循pthread标准,因此不属于C++标准的一部分。
因此,如果您的应用程序或多线程代码需要在不同的平台上运行,那么使用std::thread是有意义的,这样它就可以像在所有平台上一样工作,而无需进行任何修改。如果您不担心跨平台兼容性,那么您就可以使用pthread了。
发布于 2013-10-06 13:50:31
那得看情况。您可以对这两个API进行同样的操作,但是:
std::thread是一个标准的C++ API。它不是语言之外的单独规范的一部分(就像p线程是POSIX的一部分,而不是C或C++的一部分)。因此,可以在任何具有现代C++编译器(包括*nix和Windows)的平台上使用。std::thread是一个C++ API,所以您不能从C调用它--但另一方面,它更容易使用,也更安全。它大量地利用RAII来确保资源在超出作用域时得到清理,并且允许您从函数对象创建线程,并具有赋予您的所有灵活性,而不是被限制为C风格的免费函数。所以要看情况了。如果您希望从C和C++中使用您的代码,那么您可能希望继续使用p线程。另一方面,如果它只是C++,并且您希望它能够工作,而不管操作系统是什么,那么std::thread就更好了。如果您只想编写漂亮的C++代码,那么std::thread也是最好的选择。
发布于 2013-10-06 13:41:00
除了Alok Save关于可移植性的回答(这本身是一个很大的优势).
pthreads是一个RAII,因此它没有提供任何RAII包装器,这使得它更难使用,而且更容易出错,特别是在异常安全方面(除非您编写了自己的包装器,现在您必须调试和维护这些包装器)。
std::thread等人提供了经过良好测试的、异常安全的、现代的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();
}https://stackoverflow.com/questions/19209214
复制相似问题