c++ 多线程与c多线程有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 多线程与c多线程有啥区别?相关的知识,希望对你有一定的参考价值。
参考技术A 没有区别,因为C++和C都支持原生多线程 参考技术B 据我所知,现有的C++标准并没有内置的多线程,但是并不排除以后的C++标准支持多线程,就更别说是C的多线程了;我想你所说的是基于某一平台下的C++或者C多线程吧? 参考技术C C++ 支持多纯种编程的, 你现在用的很多软件就是 C++ 多纯程编出来的 。 参考技术D 所有数据结构的生存期,以及对这些数据结构的access,都用这一根逻辑线程。不需要考虑数据结构的race。把任何耗时的操作都给其他线程(IO线程、定时器线程,DB线程等)做,做完之后向事件队列(多线程安全的队列,其他线程是生产者,逻辑线程是消费者)丢事件。多线程逻辑设计的思路:
所有数据结构的生存期,以及对这些数据结构的access,不一定在一根线程。需要考虑数据结构的race。网络事件、定时器事件唤醒工作线程(一般通过iocp或者epoll来唤醒)执行所有工作,一般不需要交换到其他线程。
很显然,单线程逻辑多了一层事件队列交换,会增加延迟,以及所有的逻辑都在一根线程上跑,逻辑被阻塞也会带来延迟。其实吞吐量对于rpc来说,是个宏观的概念,尽可能快地消费网络消息就会提升吞吐量。对于高并发的程序,是无法忍受单线程逻辑的 第5个回答 2011-07-09 没什么区别,都是c的方法
多CPU、多核和超线程有啥区别?
【中文标题】多CPU、多核和超线程有啥区别?【英文标题】:What are the differences between multi-CPU, multi-core and hyper-thread?多CPU、多核和超线程有什么区别? 【发布时间】:2010-10-15 09:44:56 【问题描述】:谁能向我解释多 CPU、多核和超线程之间的区别?我总是对这些差异以及每种架构在不同场景中的优缺点感到困惑。
这是我在网上学习和向别人的cmets学习后目前的理解。
-
我认为超线程是其中最劣质的技术,但是便宜。它的主要思想是重复寄存器以节省上下文切换时间;
多处理器比超线程好,但是由于不同的CPU在不同的芯片上,不同CPU之间的通信比多核延迟更长,并且使用多芯片比使用多芯片成本和功耗更高多核;
多核将所有CPU集成在一个芯片上,因此与多处理器相比,不同CPU之间的通信延迟大大降低。由于它使用单个芯片来包含所有 CPU,因此与多处理器系统相比,它消耗的功率更少,而且成本更低。
这是正确的吗?
【问题讨论】:
超线程并不逊色。它非常有用,特别是对于服务器。 ILP 的收益递减(通过重新排列顺序指令使处理器保持忙碌)。超线程是提高并行性的一种替代方法:多个硬件线程执行时没有太多开销。 我关于多核和多处理器的其他观点如何,您认为我的观点正确吗?有什么问题吗? @George2 - 您的编辑非常正确。这就是整个想法。 :) 你可以在服务器上获得的最好的东西可能是多核多 CPU,但对于通常的使用,多核是最好的选择! 谢谢博格丹,有你的肯定,我更有信心了! :-) 这是对超线程的糟糕描述。要点是放弃一些每线程性能以获得更高的总吞吐量,而在乱序核心的前端只需要一点额外的硬件。请参阅 this Q&A 询问已接受答案中的类似段落(在我修复它之前的编辑之前)。 【参考方案1】:多 CPU 是第一个版本:您将拥有一个或多个主板,上面有一个或多个 CPU 芯片。这里的主要问题是 CPU 必须将它们的一些内部数据暴露给另一个 CPU,这样它们就不会妨碍它们。
下一步是超线程。主板上的一个芯片,但它内部有两个部分,因此它可以同时执行两条指令。
目前的发展是多核。它基本上是最初的想法(几个完整的 CPU),但在一个芯片中。优势:芯片设计人员可以轻松地将同步信号的附加线放入芯片中(而不必将它们布线在一个引脚上,然后穿过拥挤的主板,然后进入第二个芯片)。
今天的超级计算机是多 CPU、多核的:它们有很多主板,上面通常有 2-4 个 CPU,每个 CPU 都是多核的,每个 CPU 都有自己的 RAM。
[编辑] 你说得很对。只是一些小问题:
超线程在单个内核中同时跟踪两个上下文,从而为无序的 CPU 内核提供更多并行性。即使一个线程因缓存未命中、分支错误预测或等待高延迟指令的结果而停滞,这也可以使执行单元保持工作。这是一种无需复制太多硬件即可获得更多总吞吐量的方法,但如果有的话,它会单独减慢每个线程。 See this Q&A for more details,并解释本段前面的措辞有什么问题。
多 CPU 的主要问题是在它们上运行的代码最终会访问 RAM。有 N 个 CPU,但只有一条总线可以访问 RAM。所以你必须有一些硬件来确保 a) 每个 CPU 获得相当数量的 RAM 访问,b) 访问 RAM 的同一部分不会导致问题,c) 最重要的是,CPU 2 将被通知当 CPU 1 写入 CPU 2 在其内部缓存中的某个内存地址时。如果这没有发生,CPU 2 会很乐意使用缓存的值,而不会注意到它已经过时了
想象一下,您有一个列表中的任务,并且您希望将它们分散到所有可用的 CPU 上。因此 CPU 1 将从列表中获取第一个元素并更新指针。 CPU 2 也会这样做。出于效率原因,两个 CPU 不仅会将少数字节复制到缓存中,还会复制整个“缓存行”(无论是什么)。假设是,当您读取字节 X 时,您很快也会读取 X+1。
现在两个 CPU 在其缓存中都有一份内存副本。然后 CPU 1 将从列表中获取下一个项目。如果没有缓存同步,它不会注意到 CPU 2 也改变了列表,它会开始与 CPU 2 处理相同的项目。
这就是使多 CPU 如此复杂的原因。这样做的副作用可能会导致性能比整个代码仅在单个 CPU 上运行时所获得的性能更差。解决方案是多核的:您可以轻松添加任意数量的线来同步缓存;您甚至可以将数据从一个缓存复制到另一个(更新缓存行的部分,而无需刷新和重新加载它)等。或者缓存逻辑可以确保所有 CPU 获得相同的缓存行当他们访问真实 RAM 的同一部分时,只需阻塞 CPU 2 几纳秒,直到 CPU 1 进行更改。
[EDIT2] 多核比多 CPU 更简单的主要原因是在主板上,您根本无法在两个芯片之间运行所有需要使同步有效的线路。再加上一个信号只能传播 30 厘米/纳秒的顶部(光速;在电线中,你通常会少得多)。并且不要忘记,在多层主板上,信号开始相互影响(串扰)。我们喜欢认为 0 是 0V,1 是 5V,但实际上,“0”介于 -0.5V(从 1->0 下降线时过驱动)和 0.5V 之间,而“1”是高于 0.8V 的任何值。
如果您将所有东西都放在一个芯片中,那么信号会运行得更快,并且您可以拥有任意数量的信号(嗯,几乎 :)。此外,信号串扰更容易控制。
【讨论】:
您对超线程的概念可能有点误导,因为超线程“只是”模拟了多个线程的并行执行——但主要是尝试通过内置 CPU 逻辑来提高多线程性能。 @jcinacio,超线程能提高多进程性能吗?为什么? @Aaron, 1. 在向您学习后,我在原帖中编辑了我当前的观点。你能帮忙评论和评论吗? 2. 什么意思是“将他们的一些内部数据暴露给另一个 CPU,这样他们就不会妨碍他们”。在你的帖子里? @Aaron,你的回复太好了,我的最后一个问题,为什么你说多核CPU解决了CPU状态同步/等待RAM问题?我认为如果代码逻辑相同,那么同步和等待 RAM 问题仍然存在。有没有cmets? @AmitP 请注意too broad 的问题往往会在 Programmers 被否决并关闭,请参阅 What goes on Programmers.SE? A guide for Stack Overflow【参考方案2】:您可以在Intel's website 或Yale University 的短文中找到一些关于双 CPU、多核和超线程的有趣文章。
我希望你能在这里找到你需要的所有信息。
【讨论】:
博格丹,我在原帖中编辑了我当前的观点。你能帮忙评论和评论吗?我是在阅读了您推荐的链接后才知道的。 @George2 - 您的编辑非常正确。这就是整个想法。 :) 你能在服务器上得到的最好的东西可能是多核多 CPU 两个链接都坏了:(【参考方案3】:简而言之:多 CPU 或多处理器系统有多个处理器。多核系统是在同一芯片上具有多个处理器的多处理器系统。在超线程中,多个线程可以在同一个处理器上运行(即这些多个线程之间的上下文切换时间非常小)。
多处理器已经存在 30 年了,但主要是在实验室中。多核是新流行的多处理器。如今,服务器处理器与多处理器一起实现了超线程。
关于这些主题的***文章非常具有说明性。
【讨论】:
阿米特,1. 在向您学习后,我在原帖中编辑了我当前的观点。你能帮忙评论和评论吗? 2.你的帖子中的死和撕裂是什么意思?以上是关于c++ 多线程与c多线程有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
visual studio2010的项目属性设置中,运行库选择多线程,多线程调试,多线程dll,多线程调试dll有啥区别