97
回答
关于 《C++并发编程指南》的一些想法
华为云实践训练营,热门技术免费实践!>>>   

小伙伴们大家好,

最近几天我被小伙伴的热情惊呆了,感谢大家的热烈讨论,看来大家都是高手,很多人水平也比我高,我做过多的评价也不合适,我自己也说了,这本“书”(如果你把它看做是书的话)现在还只是自己以前写的一系列介绍 C++11 多线程支持库和原子操作库的笔记,确实还不具备成为书的条件。

至于说究竟什么是并发编程, C++ 适不适合做并发编程,我也相信每个人都有他自己的理解,强行地把自己的观点灌输到别人身上是不对的。不过既然 C++03 标准没有语言级别的原子操作和多线程支持,但是在 C++11 中却加了这两项内容,如果某些小伙伴还坚持认为“C++ 和 并发 没有任何关系, 用C++做并发, 是最为愚蠢的一种行为.”,那这些小伙伴对 C++ 的理解是不是还停留在10年前呢,现在都 2013 年了,看看 WG21 N3242(虽然C++11正式标准巨贵,但是这个草案是免费的,一本 1134 页的大部头) 吧,看看 C++ 新标准的 memory model 吧,右值引用,lambda 表达式,正则式,智能指针,哪个不是激动人心的新特性。不知道喷 C++ 的小伙伴们对 C++11 又了解多少,如果对 C++11 新标准所知不多,真的建议去看看,不要看网上乱七八糟的转载小品文,而是直接看C++标准(草案)(可能又有人说我装B了,但至少我自己是看标准的,也建议小伙伴们都去看标准)。

也有人说我没有搞清并发是什么,我确实承认自己对并发理解得不深,某某同学说

并发控制是一种操作系统行为 并且, 所有的实现, 都是通过呼叫操作系统原语来实现

确实没错,语言(C++,Java,Erlang)层面的并发控制确实是调用的操作系统提供的并发原语(当然也有可能直接调用某些汇编指令),但操作系统的并发也是由 CPU 支持的。如果真的要说并发的属于哪个层次的,我想各个层次都有,但最终最底层的无非是 CPU 硬件层次的并发,操作系统只是帮你管理硬件资源的,这个大学教材里也是这么写的吧。所以,我所理解的并发只是个概念,它在各个层次都有,语言级别,操作系统级别,硬件级别,只是抽象层次不同而已,没有必要纠结并发只能处于哪个级别。想想你在用 C++ 写多线程程序的时候,会去直接操作 CPU 么,很明显不会,直接使用 std::thread、std::mutex(对,现在你可以直接使用 std 命名空间里面的 thread, mutex, condition_variable,哦还有 future 了(类似 Java)) 就行了,编译器和操作系统会帮你管理好的。因此,我所理解的并发不是非要处在某个特定层次的操作才叫并发。C++ 语言级别的并发只是提供了你一个抽象,让你不用去管底层是怎么实现的,Java 也是如此。

写了这么多,我也不想引起大家对某一门特定语言优劣的口水战,更不想发生任何语言上的人身攻击,技术嘛,适合自己的应用场景就好。

最后,我承认现在这本“书”(如果你把它看做是书的话)写的不好,毕竟才刚刚开始嘛,如果一开始就做得很好了我就直接去找出版社了,任何东西都是由不好到好的,中间的过程可能很痛苦很漫长,后面我会持续更新“书”(如果你把它看做是书的话)中的内容的,欢迎小伙伴们挑毛病提问题,但是。。。和谐社会,口水战可以有,但是不要有人身攻击 ;-)

举报
大卷卷
发帖于4年前 97回/7K+阅
共有97个答案 最后回答: 4年前
任何事情有支持的一面, 就一定有反对的一面, 你做的工作肯定会有他的价值, 管别人怎么说..., 支持lz.
唉喜欢用C++的,用去吧,归根结底你是没法驳倒他们的,你再怎么说不好,他们还是说好,情人眼里出西施,你又能如何

引用来自“宏哥”的答案

引用来自“Mallon”的答案

唉喜欢用C++的,用去吧,归根结底你是没法驳倒他们的,你再怎么说不好,他们还是说好,情人眼里出西施,你又能如何

我也同意这个看法

不仅不要反驳, 还要鼓励. 

鲁迅在人血馒头里面谈到这个问题 -- 人血馒头, 有益健康嘛

当前关注的主要是手上这些工具是否 堪大用的问题, 不要给我惹麻烦, 就最好.

只要别逼着别人用C++就好,哈哈

冷静

原语是操作系统提供的一种服务,通过系统调用实现, 是运行在操作系统内核空间

非应用程序空间

并发是一种操作系统行为,  操作系统通过管理计算资源, 为应用程序提供的一种服务

没有操作系统提供的这个服务, 任何语言实现并发,都是非常困难的, 相当于要把操作系统的进/线程管理,再实现一遍。

之所以叫做原语, 就是不可分割, 意味着, 你无法提供任何抽象。

至于STD命名空间的mutex之类的玩意, 除了把事情搞糟,搞复杂, 搞更多的BUG,

没有任何意义。

方向错了, 任何努力都毫无意义

只有两个凡是, 才是照亮道路的明灯

--- 共有 4 条评论 ---
宏哥回复 @郭煜 : 是的. 如底层. 4年前 回复
乌龟壳回复 @宏哥 : 我们说的其实没有冲突,我只是补充一下而已,所以我才说*简单*的并发程序。为何有硬件级别的负载均衡,为何交换机从来没遇到C10K。就可以看出有些问题是到了某个层面才会出现的。 4年前 回复
宏哥回复 @郭煜 : 一个上下文切换, 就足够你浪费一辈子在上面了. 如果操作系统没有提供确实有价值的服务, 要操作系统做啥. 4年前 回复
乌龟壳如果只是简单的并发,比如交换,代理等,没有操作系统,只要管理好状态机,就能写出比带上操作系统后更高性能的并发程序。在底层是没有并发的概念的,主要是有了操作系统,多线程或者多进程产生的局限,才有并发这个课题。就想用对了语言后,设计模式就没有太大价值了。 4年前 回复

引用来自“宏哥”的答案

冷静

原语是操作系统提供的一种服务,通过系统调用实现, 是运行在操作系统内核空间

非应用程序空间

并发是一种操作系统行为,  操作系统通过管理计算资源, 为应用程序提供的一种服务

没有操作系统提供的这个服务, 任何语言实现并发,都是非常困难的, 相当于要把操作系统的进/线程管理,再实现一遍。

之所以叫做原语, 就是不可分割, 意味着, 你无法提供任何抽象。

至于STD命名空间的mutex之类的玩意, 除了把事情搞糟,搞复杂, 搞更多的BUG,

没有任何意义。

方向错了, 任何努力都毫无意义

只有两个凡是, 才是照亮道路的明灯

不敢赞同您说的啊,您说的:“原语是操作系统提供的一种服务,通过系统调用实现, 是运行在操作系统内核空间”,但是您能保证在某个平台下(比如 Linux)应用程序去调某个系统调用是原子的么?原语一般是 CPU 提供的吧,像  X86 平台下 CMPXCHG 指令是原子的,操作系统没办法脱离 CPU 凭空模拟出一个,就算模拟出来了代价也是很大的。另外,并发只是一个概念,并不是操作系统才特有的,CPU 硬件里也有超线程、多流水线之类的啊,这也可以理解成一种指令的并发执行,所以并发就看在处于哪个层次了。建议您先看看操作系统的知识,或者可能您自己理解正确了,但是表达出来会让读者认为原语是操作系统调用实现的,而原语是不可分割的,那推理得出系统调用也是不可分割的,但系统调用并不是原子的,所以您这么表达就不准确了。

另外,std::mutex 里面的玩意儿,还真的没有把事情搞砸,而是把事情搞简单了,bug 更少了,std::mutex 只是封装了不同平台下多线程实现,本身只是标准而已(就是定义了一套语义,但是真正的实现还是取决操作系统),这样的好处就是你用 C++ 写多线程程序的时候不用在意在不同平台上面自己封装了(自己封装 bug 一大堆),在语言级别提供了多线程的功能,方便了 C++ 开发者。

顶部