C++
文章平均质量分 78
fpcc
行之苟有恒,久久自芬芳!
展开
-
并行编程实战——TBB中Task Scheduler的执行
任务调度在哪儿都是一种非常让人纠结的事情。就像一个大厨,有一两个人时,饭菜就容易为所有人所表扬,可当面对上百人时,可能就有不少人给差评了。所以一个好的框架,不但要提供默认的管理调度手段,也要提供针对个性化的定制场景的接口。既要面对主流,也要取悦小众。难点,在于一个平衡!做为开发者,要从学习代码的最初的功能到学习其架构,在到其整体的设计思想,这才是最终极的目标。原创 2024-09-22 10:20:15 · 318 阅读 · 0 评论 -
并行编程实战——TBB中的Task Scheduler
任务调试器等于是TBB底层提供的一种基础控制流程的手段。它既是一个非常强大的应用方式,也是一种很复杂很难驾驭的任务调度方式,所以TBB的应用中,尽量还是多使用其上层封装好的相关并行算法和任务调度模板。这就和汽车一样,主流的情况下请采用自动档驾驶,但遇到一些特殊情况,可以使用手动方式进行驾驶。万物相通,道理相同!原创 2024-09-21 15:13:29 · 383 阅读 · 0 评论 -
c++应用网络编程之九Linux下的select模式
虽然在现代的高并发网络通信中,几乎已经看不到select模式的身影,但这并不代表着它的作用很小。正如前面反复所讲,最合适的才是最好的。一个并发量不大,安全要求又高的场景下,可能一个普通程序员用Select模式就能搞定。但非要上一些epoll之类的“高端大气上档次”的模型,未必是一件好事情。开发者习惯的东西未必是一个全面的知识,select模式既可以用在服务端也可以用在客户端,这估计让许多初学者可能跌了一下眼镜。虽然大多是在讲服务端编程时学习select模型,但这不代表着他只能应用在服务端。原创 2024-09-17 09:32:05 · 1163 阅读 · 2 评论 -
并行编程实战——TBB中的Task
从TBB框架中的任务可以瞥见一种趋势,即在设计上对底层进一步封装,特别是对一些复杂的如线程、进程以及IO的操作。尽量屏蔽与硬件结合较紧密的部分功能,从而在更高的抽象上实现对目标的解耦。而解耦的最终目的,就是让整个框架的适应性更广泛,应用更灵活。这也是做为开发者学习框架的一个重要的原因和目的。最后,学会了一定要学以致用。原创 2024-09-16 09:10:34 · 342 阅读 · 0 评论 -
并行编程实战——TBB中节点的数据结构
在前面分析过了节点相关的应用和功能,也在其中分析过一些节点的数据定义情况。本文就对节点的数据定义进行一个更详细具体的分析说明,特别是对一些应用上的细节展开说明一下。知其然,然后知其所以然。节点的定义,基本都是以模板进行的。所以希望大家有一些基本的模板的知识,否则看起来还是有些麻烦的。原创 2024-09-16 08:41:30 · 849 阅读 · 0 评论 -
并行编程实战——TBB中消息并行策略的控制
不同的节点有着不同的处理机制,而实际的应用场景千变万化。到达罗马的大路不止一条,何况还有小路。所以,正确的选择可能有很多,但如果寻找一条更适合当前环境的设计思路,这才是重点。最好不一定合适,合适其实从某种意义上说才是最好。原创 2024-09-07 09:01:30 · 584 阅读 · 0 评论 -
并行编程实战——TBB的安装
一个好的框架,必然是容易使用。不光是接口让开发者感觉良好,环境安装也要相对简单。否则除了一些技术极客对大多数开者来说,可能安装就被劝退了。这种情况还是比较常见的。比如早期的Eclipse就被后来的idea给抢占了大半的江山。而在Windows平台上,Vistual Studio一直是一座绕不过去的大山。就是因为这两者都是容易安装和使用,一般不会有什么需要具体的配置才能进行正确的进行开发。简单是永远是方向,至于简单到何种地步,就见仁见智了。原创 2024-09-06 21:55:43 · 496 阅读 · 0 评论 -
c++应用网络编程之八SOCKET探究
我们分析完成了一般网络通信的原理和相关的IO通信的机制,已经基本明白了网络通信到底是怎么一回事,以及其相关的难点和重点。国内的教科书往往有一个重要的问题,就是从来不连贯的讲述一个知识点,而是将这些知识点打乱并且乱序讲解。这样做很难让一个人把网络通信的相关知识融会贯通。换句话说,基本上靠自觉把相关的体系建立起来的可能性极小。这也是本系列一开篇并没有像传统的书本把网络基础知识大讲一通,然后再搞几个IO模型举几个例子,基本上这书就过去了。原创 2024-09-01 13:56:45 · 1345 阅读 · 3 评论 -
跟我学C++中级篇——并发中的锁的类型和分析
锁的底层机制就是对资源的限制性利用,在效率和安全下寻求一个平衡。无论是现实世界还是计算机世界,资源的有限性才造就了竞争,而要让资源被安全的最大化利用,就需要一种管理机制,在现实世界,就是法律和道德;在计算机世界就是锁。锁,其实就是计算机中的权力的象征!谁拥有了它,就可以自由的使用资源来工作。原创 2024-08-31 10:52:47 · 1064 阅读 · 0 评论 -
跟我学C++中级篇——explicit的分析
其实一直对这个关键字没有注意过,虽然也会使用,但也没有什么深刻的印象。有的时候看代码发现多个参数的构造函数也应用了这个关键字,也没有发现有什么不妥。直到后来一次实际操作中,才发现其实多个参数使用它没有实际意义。虽然不至于有什么问题,但仍然是对细节的把控不到位。写这篇文章就是和诸君共勉!原创 2024-08-30 21:53:57 · 644 阅读 · 3 评论 -
软件中的重构
在现实世界里,经常会看到一些现象。举一个简单的例子,自己的家里可能时间久了,觉得家俱的摆设、风格或者位置等会动一动。如果觉得整体的家庭的环境都不太喜欢了,或者说让居住者不舒适了,还可能找人重新装修。这就可以理解成重构。它是对房屋内部的装饰的一种重构。当然,如果整个房子有些老旧,甚至可能有些年久失修的风险,但发现房子的基础和墙壁大梁等还挺结实,那么也可以再次在此基础上进行加固或者拆除不好的部位重新换上新的部分。这也可以理解成对房屋的重构。那么有人会问,如果房屋需要推倒重建呢?那就不是重构了,那是再建。原创 2024-08-25 08:09:59 · 872 阅读 · 3 评论 -
跟我学C++中级篇——sleep和wait的不同
其实在实际应用中,二者的应用大多是泾渭分明的。但真正的细节上的区别,还是需要认真的掌握。不然在开发具体的工程时,可能会一时疏忽导致不可预测的问题和错误。还是那句话,细节决定成败,但不能拘泥于细节。这个度,就需要开发者自己不断养成自己的判断。原创 2024-08-24 09:28:47 · 890 阅读 · 0 评论 -
TBB中的join节点的Reservation
TBB框架有很多细节需要处理,但勿需焦虑。很多的细节其实在应用的时候儿就会自然的出现,不明白再去查阅相关的文档即可。重点是掌握好其整体的逻辑流程,抓大放小,强干弱枝。还是那句话,细节很重要,但不要限入细节不可自拔。原创 2024-08-18 08:33:27 · 243 阅读 · 0 评论 -
c++应用网络编程之七基于线程的模式
面对问题,最主要的是分析问题产生的原因,找出解决的方法,实现解决的过程即分析问题,解决问题,验证结果。如果没有一套理论体系来支持,那么只能是尝试,反复不断的尝试或者说有经验者在经验的指导下的尝试。如果是科学研究碰触到的全新的领域,如此做法,未尝不是一种好的办法。但如果是在既有的知识体系中,再做如此行为,就有些盲目努力的感觉了。时事不同,则指导思想不同。与时俱进,实事求是罢了!原创 2024-08-17 11:13:28 · 479 阅读 · 3 评论 -
并行编程实战——TBB中的节点通信
在TBB中,可以理解任务分解、处理和并行这种机制开放给了应用开发者,而并行的实现和并行间的同步以及与实际线程和缓冲等数据处理,由TBB框架自行完成。这样,开发者更专注于实际的业务而对底层的并行实现透明处理。它的优势在于抽象隔离了底层并发的复杂性,实现了业务层面的聚焦。不过,这种方式的实现需要有一个前提,需要开发者对并行及其相关的实现有相当的了解,否则在遇到复杂的业务逻辑时,出现各种问题反而更不容易解决。总之,事物总有其两面性,辩证的看问题吧。原创 2024-08-11 14:57:45 · 319 阅读 · 1 评论 -
跟我学C++中级篇——返回值优化
在开发者编写代码的过程中,很多函数需要返回值的。如果只是简单的返回一个基础类型值,即使有一些浪费,这些浪费在整体的程序运行中其实影响还是相当小的。但当开发者自定义一些数据结构或者字符串等的返回时,就有可能出现多次拷贝的现象。这样的运行成本可能就相当大了。开发者在早期的编译期环境中,可能需要一些具体的技巧来处理这些返回值,但在越来越优秀的编译器加持下,返回值优化的手段从开发者不断的向编译期转移。这和前文(跟我学C++中级篇——临时对象)分析过的临时对象有着很大的联系,可一并参考学习分析。原创 2024-08-10 18:16:07 · 981 阅读 · 0 评论 -
并行编程实战——TBB中的节点和边的应用
基础是很重点的,这个勿需多言。学习TBB中基础的例子,就可以明白其运行的最基础的方式。重要的不是把例程跑通,而是理解其中的图的作用,进而明白节点和边在其中起到的作用。当明白图是如何在整个TBB中利用边动态组合节点时。基本上对这个框架的主要框架就知晓了。家乡的老话,有了骨头还怕不长肉。原创 2024-08-10 08:15:56 · 278 阅读 · 1 评论 -
并行编程实战——TBB节点类型
在节点的应用中,要注意区分单输入(输出)、多输入(输出)与广播、单播的不同。前者指只有一个输入输出的节点,后者指的是数据转发的方式。一般来说,前者控制的是节点中控制数据流的点的数量,后者指的是连接发送的策略。TBB的应用还是有很多细节可挖的,可惜一般的地方用不到这个框架。有兴趣的可以一起学习分析。原创 2024-08-04 09:51:10 · 724 阅读 · 1 评论 -
并行编程实战——TBB中的图
TBB中图的使用是一个非常巧妙的设计,但是一定要明白图设计中的一些细节,特别是图连接状态与节点激活间先后以及是否保证数据的安全流动(如不丢失数据)。在前面分析的文章中就遇到了这类问题,所以一定要把TBB整体的流程和协调方式以及各种相关关系理清,才可能更大限度的发挥TBB的性能。原创 2024-08-03 08:45:55 · 483 阅读 · 0 评论 -
Linux光盘刻录
这类技术如果不是说专门要搞这个行业,一般不用钻研进去多深。只要明白基本的技术流程,然后借助第三方库完成即可。这就是经常说的抓大放小,提纲挈领。原创 2024-08-02 21:51:49 · 1025 阅读 · 0 评论 -
分支预测分析
在前面的文章“C++20中的分支预测”中,对C++20中的静态分支预测进行了分析说明。本文从整体上对分支预测(Branch Prediction)进行一个全面的分析说明。首先来看一个分支预测的定义:由CPU预判程序分支的执行指令,从而减少错误方向的选择,加快运算速度。这项技术是从P5(奔腾5)处理器开始应用的。分支预测可以分为动态分支预测和静态分支预测两种。静态分支预测其实就是在编译程序时直接预测分支跳转的方向;而动态分支预测就是在程序运行时根据一定的算法来预测分支跳转方向。原创 2024-07-28 09:22:03 · 310 阅读 · 0 评论 -
跟我学C++中级篇——处理if条件分支语句
仍然是那句老话,“没有包打天下的技术”。想要灵活机变的综合应用各种技术解决实际问题,首先应该把基础打好,然后在实践中不断的应用总结。要善于发扬每种技术的长处,共同配合完成工作需要。所以搞技术学一些系统工程的知识也是相当有用处的。原创 2024-07-27 09:33:24 · 471 阅读 · 1 评论 -
c++应用网络编程之五Windows常用的网络IO模型
在Windows平台上,网络高并发的开发,重点以游戏居多。其它的当然也可以做,毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向,开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿,精神食粮就提到了必须的日程上来。至于游戏对青少年的影响,就看大环境了。已经好多年不在Windows上进行编程了,以后的网络编程重要分析也是以类Linux平台为主。原创 2024-07-21 13:02:43 · 652 阅读 · 1 评论 -
c++应用网络编程之四Linux常用的网络IO模型
实事求是,与时俱进,理论联系实际,实践是检验真理的唯一标准…,这些理论每个人可能都会脱口而出。但真正的应用环节呢?可能绝大多数人会有意无意的找各种借口,陈陈相因,因循守旧,更别提创新意识了。只有在实践中深入分析掌握了现有技术的优劣,才可能知晓应用场景下的各种技术不足,才可能产生创新意识。网络编程中这种例子特别多(如io_uring,dpdk),毕竟实际应用的在不断提高对网络技术的要求。而更可怕的是,这种要求不但没有降低还在不断的提高。原创 2024-07-20 10:49:21 · 731 阅读 · 1 评论 -
跟我学C++中级篇——虚函数的性能
学习知识不是简单的为了会用,而是能够灵活的运用。要想灵活的运用,则必须掌握技术本质的内涵。只有把其内在体系掌握,才能在具体的场景上发挥其优势。这也是总说的从必然世界到自由世界的一个哲学问题。原创 2024-07-19 21:43:46 · 988 阅读 · 2 评论 -
跟我学C++中级篇——常见的错误问题分析
无论是菜鸟还是老鸟,在写C++代码时(也包括C中的部分),往往会犯一些常见的错误,可能这个错误回过头来看不算什么,但却经常让开发者忽视或者说忘记。这些问题大多都不是多么高深伯问题,修改后让人大呼真是大意了。很多问题,在前面的文章中都说明或者分析过,可能没有引起大家的重视,本文将其大略总结一下,以咨为正。主要是总结常见问题或者说一些容易忽视的问题,所以对复杂和不太常见的就不提了。C++学习曲线比较陡峭,之所以想总结一下这些常见问题,就是给入门和初中级开发者一个借鉴。原创 2024-07-13 08:24:36 · 336 阅读 · 2 评论 -
并行编程实战——TBB编程流图的问题
有时间应该看看TBB的底层源码。其实可能看到源码,瞬间就明白了原因,可是现在只是上层应用,那么就只能靠经验和文档来处理类似的问题了。框架的运用,其实重点在于明白其内在的运行逻辑和控制流程,再加以代码辅助,文档说明,这是最佳的打手伴侣。原创 2024-07-12 22:10:10 · 864 阅读 · 1 评论 -
c++应用网络编程之二网络的IO模型
网络服务端编程是复杂的,要先从宏观上把网络通信的相关机制搞清楚。这样才能更好的在开发过程中明白一些细节的掌控,而不至于迷失在细节当中。这个系列会从顶层一点点的抽丝剥茧的把相关背景和技术栈分析展开,并对它们的相对关系进行分析说明。某些具体的细节如果不必要就不展开了,请大家自行查阅相关书籍或者资料。原创 2024-07-06 10:52:02 · 945 阅读 · 1 评论 -
c++应用网络编程之一基本介绍
c++编程的应用场景在前面分析过,一个重要的方向就是网络编程。一般来说,开发者说的服务端编程在c++方向上简单的可以认为是网络编程。首先需要说明的,本系列不对网络编程的相关基础知识展开详细的说明,因为这种知识在书本上太多了。网络上各种资料更是满开飞,没有必要拷贝来拷贝去的。特别是一些协议等的解析说明,如果不遇到特定的问题不会深入分析说明。那么最应该明白的网络编程是什么?那么就得明白网络是如何而来。网络,从名字上很好理解,一张把“经络”连接起来的大网。原创 2024-06-30 11:10:36 · 731 阅读 · 3 评论 -
网络编程之XDP、TC和IO_URING以及DPDK
学习理论知识十分的枯燥,特别对工作后的人,不论是从记忆力还是注意力,已经从单纯的学习转向了为了生活而打拼。此时对一些理论性的东西往往感到没有什么意义。但还是需要强调的是,计算机技术是一门非常强的理论和实践高度结合的技术学科。理论和实践缺一不可,新技术的突破往往是开发应用瓶颈的突破口,不需要到处再打补丁;同样,丰富的实践场景可以推动技术的完善和创新。思维不要僵化,要与时俱进。原创 2024-06-23 09:31:47 · 681 阅读 · 2 评论 -
网络编程之XDP技术的基础eBPF
eBPF的发展史,就是一部需求推进的发展史。所以说,技术不落地,发展的速度就会受限。反过来,强劲的落地需求,推动着技术不断的完善和快速发展。学习也是如此,如果只是为了学习新技术而学习,无法在实际工作中应用,那么技术学习了往往也会被忘记。而如果在实际的场景中应用到,那么对技术的理解会越来越深越来越通晓。这样,在后面的工作中会应用的如鱼得水。甚至有可能反过来,深入技术内部进行完善和修改。原创 2024-06-22 11:04:01 · 1118 阅读 · 1 评论 -
一步一步写线程之十五协程
人难得是选择,选择是最痛苦的。但一旦选择完成,朝着方向前进,其实反而没有什么可痛苦的了。今天讲协程,没有继续于以往的技术实现的原理和实现的框架或者应用的方法,而是从另外一个角度分析其在计算机发展过程上的定位。言简意浅,与诸君共勉!原创 2024-06-16 14:43:36 · 626 阅读 · 0 评论 -
网络编程之XDP和TC
创新是技术的灵魂。不断重复的技术其实就是一种落后的表现。做为一个开发者,加入创新技术的大军可能是很小概率的事件,但不代表对新技术的不敏感。对于开发者来说,新技术的优秀重点在于落地。不能落地的新技术,还不如老的技术。原创 2024-06-15 12:10:51 · 808 阅读 · 2 评论 -
c++工程实践——实际工程中的文件读取和日期处理的小问题
万丈高楼平地起,基础的重要性已经反复说得都麻了。但不得不说,往往都明白基础的重要性,可其实并未真正时刻挂在心上。上面的例子就说明了学习态度中的一些瑕疵,与诸君共同努力改正吧。原创 2024-06-14 21:56:58 · 364 阅读 · 1 评论 -
跟我学c++高级篇——技术进步对开发演进的影响
与时俱进,不断用发展的眼光看待和解决问题。掌握技术发展的规律并不断的跟进,有可能的话甚至参与到技术的创新中去,这才是一个开发者应该具备的基本认知。其实无论任何技术都是如此,最终发展成为一个哲学问题。与诸君共勉!原创 2024-06-09 18:38:11 · 991 阅读 · 1 评论 -
跟我学C++高级篇——回调函数及应用
之所以把回调函数放到高级篇,不是说回调函数本身有多么高级而是回调函数的应用是非常灵活的,用得精妙之处,完全可以放到高级的应用中。一个简单的回调函数,最大的优势是可控和安全。但回调函数不是没病的山梨儿,大家还是要斟酌考虑,不要滥用。原创 2024-06-07 23:47:58 · 1546 阅读 · 1 评论 -
c++外部模板
模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。原创 2024-06-05 17:42:44 · 392 阅读 · 1 评论 -
一步一步写线程之十四并行编程和并行库
古人说:“工欲善其事,必先利其器”,牛顿说要站在巨人的肩膀上,道理都是想通的。程序的设计开发也是如此,前人做过了很多非常有益的工作,后来者不必非再重复造一个轮子。但说这话得有一个前提,你得知道怎么造轮子,并且明白其内部的猫腻。学以致用,用而后思。不断总结推进自己的编程水平和提高自己的编程思想,这才是王道。并行编程并不是本系列文章的目的,这里把并行编程的相关进行基础的分析介绍,主要目的是让开发者明白,所谓并行框架的基石,仍然是多线(进)程编程。原创 2024-06-02 09:01:56 · 781 阅读 · 1 评论 -
一步一步写线程之十三队列间的消息通知
其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。原创 2024-06-01 08:19:11 · 463 阅读 · 1 评论 -
跟我学C++中级篇——if constexpr的应用
要关于对老的知识点的综合应用并不断的总结这种用法的可用之处,从而不断的推导出问题的解决办法。再通过这种解决办法可以看新的标准中是否有类似的更方便的方法,就可以更好的理解和认知一些技术点。可上层的给定的缓冲区内的数据类型确实是可变的,做为一个中间处理层,如何能够正确的引导程序自动适配准确的函数调用呢?本来这个非常简单,只要定义一个模板即可搞定,但这里偏偏有一个细节,是调用别人的库来实现写入。而这个库对不同的数据类型的写入,提供了N种不同的函数,这些函数只是名字和写入数据类型不同,其它都完全一样。原创 2024-05-31 21:53:18 · 610 阅读 · 0 评论