Mik*_*ike 19 multithreading pthreads grand-central-dispatch
在最近学习了Grand Central Dispatch之后,我发现多线程代码非常直观(使用GCD).我喜欢这样一个事实,即不需要锁(事实上它在内部使用无锁数据结构),并且API非常简单.
现在,我开始学习pthreads,我不禁对复杂性感到不知所措.线程连接,互斥体,条件变量 - 所有这些事情在GCD中都不是必需的,但在pthreads中有很多API调用.
pthreads是否比GCD有任何优势?它效率更高吗?是否存在正常使用情况,其中pthreads可以执行GCD无法执行的操作(不包括内核级软件)?
在跨平台兼容性方面,我并不太关心.毕竟,libdispatch是开源的,Apple已经将其关闭更改作为GCC的补丁,clang支持关闭,并且已经(从FreeBSD开始),我们开始看到一些非Apple的GCD实现.我最感兴趣的是使用API(具体的例子会很棒!).
kfm*_*e04 15
我来自另一个方向:开始pthreads在我的应用程序中使用,我最近用C++ 11代替了它std::thread.现在,我正在使用更高级别的构造,如伪升级线程池,甚至更抽象的英特尔线程构建模块.我认为GCD应该达到甚至高于TBB.
一些评论:
pthreads或那样调用一个线程库std::thread.std::thread更高级别的库可用吗?答案是肯定的.使用更高级别库的优点是,从实现细节中抽象出来.使用更高级库的缺点还在于从实现细节中抽象出来.在使用时pthreads,我非常了解对象的共享状态和生命周期,因为如果我放松警惕,特别是在中型到大型项目中,我很容易就会遇到竞争条件或内存故障.当我使用更高级别的库时,这些问题会消失吗?并不是的.看起来我不需要考虑它们,但事实上,如果我对这些细节感到邋,那么库的实现也会崩溃.因此,您会发现,如果您了解较低级别的构造,那么所有这些库实际上都是有意义的,因为在某些时候,如果您使用较低级别的调用,您将考虑自己实现它们.当然,在这一点上,通常最好使用经过时间考验和调试的库调用.那么,让我们分解可能的实现:
pthread和std::thread调用:实际上很少有人学习,但要正确使用它们需要注意细节并深入了解应用程序的工作方式.如果你能理解这个级别的线程,那么更高级库的API肯定会更有意义.哪一个最快? 令人惊讶的事实是,它可能是上述三种中的任何一种.要获得多线程的速度优势,您可能需要彻底重新组织算法.利益是否超过成本是高度依赖于案例的.
哦,OP询问了thread_pool不合适的情况.简单的情况:如果你有一个紧密的循环,每个循环不需要很多循环来计算,使用thread_pool可能比没有严重重做的好处花费更多.还要注意函数调用的开销,例如通过线程池的lambda与使用单个紧密循环.
对于大多数应用程序,多线程是一种优化,所以在正确的时间和地点进行.
sle*_*man 14
那种压倒性的感觉,你正在经历......这正是GCD被发明的原因.
在最基本的层面上有线程,pthreads是线程的POSIX API,因此您可以在任何兼容的操作系统中编写代码并期望它能够工作.GCD建立在线程之上(虽然我不确定它们是否真的使用pthread作为API).我相信GCD只能在OS X和iOS上运行 - 简而言之就是它的主要缺点.
请注意,大量使用线程并需要高性能的项目会实现自己的线程池版本.GCD允许您无数次地避免(重新)发明轮子.