茱莉亚•埃文斯

的一个例子在特使c++析构函数是如何有用的

一段时间现在我一直使用c++项目(代表),有时我需要当众做出贡献,所以我的c++技能已经从“不存在的”“真的很小”。我明白了什么是aninitializer列表方法入手~是一个析构函数。我几乎知道anlvalue和一个右值但不完全。

但是有一天当编写一些c++代码我想出了一些激动人心的关于如何usedestructors我还没有意识到!(tl;博士的这篇文章了解c++的人是“juliafinally理解RAII是什么,它是有用的”:))

析构函数是什么?吗?

c++对象。当一个c++对象超出范围,编译器插入一个叫itsdestructor。如果你有一些代码

do_thing()函数{事x {};/ /这个调用的构造函数返回2;}

将会有一个叫x的析构函数的末尾do_thing函数。因此,c++代码生成看起来像:

  • 让新事物
  • 调用新事物的析构函数
  • 返回2

显然这样的析构函数更复杂。他们需要被调用时areexceptions !手动有时他们被调用。和很多其他的原因。但are10几百万的东西了解c++和这不是我们今天所做的,我们现在讨论一件事情。

析构函数中发生了什么?吗?

很多时候内存被释放,这是你如何避免内存泄漏。但这不是我们正在讨论这篇文章!我们谈论的是更有趣的东西。

我们感兴趣的东西:特使断路器

所以我一直使用特使。3第二特使复习:这是一个HTTP代理,你的applicationmakes请求特使,然后代理请求到服务器应用程序希望对。讲话

特使一个非常有用的特性是这个东西叫做“断路器”。基本想法withis,如果应用程序500亿连接到服务,可能overwhelmthe服务。所以特使跟踪你已经取得了多少TCP连接到服务,并将阻止你makingnew请求如果你达到极限。默认的max_connection限制

你怎么跟踪连接数?吗?

维持一个断路器在TCP连接的数量,这意味着你需要保持anaccurate数有多少TCP连接当前打开的!你怎么做呢?好吧,itworks是维护的方式连接计数器和:

  • 每次打开一个连接,递增计数器,
  • 每次连接被摧毁(由于重置/超时/不管),减量thecounter
  • 在创建一个新的连接时,检查连接计数器是不限制

这是所有!和递增计数器,当创建一个新的连接是非常容易的。但是你如何确保柜台递减wheh连接被摧毁?连接可以摧毁在很多方面(他们可以超时!他们可以通过特使关闭!他们可以关闭以服务器!也许别的我没有想到会发生!),似乎很容易toaccidentally小姐关闭他们的一种方式。

析构函数来拯救

特使解决这一问题的方法就是创建一个连接对象(称为ActiveClient在HTTP连接池)为每个连接。

然后它:

  • 在构造函数中增加柜台(代码)
  • 柜台的精神性的析构函数(代码)
  • 检查柜台当创建一个新的连接(代码)

美女,现在你不需要确保柜台会递减在所有正确的地方,你现在只需要组织你的代码,这样ActiveClient对象的时候调用'sdestructor连接已经关闭。

在哪里ActiveClient析构函数被调用特使?好吧,特使维护2列出ofclients (ready_clientsbusy_clients),当一个连接被关闭时,特使删除客户的列表。当它,它不需要任何额外的清理!!在c++中,只要从列表中删除一个对象,它的析构函数被调用。所以client.removeFromList (ready_clients_);;负责所有的清理。还有没有机会offorgetting递减计数器!!它肯定会经常发生,除非你不小心leavethe对象在一个列表,这将是一个错误,因为连接关闭:)

RAII

这种模式特使正在使用这是一个非常常见的c++编程模式称为“resourceacquisition初始化”。I find that name very confusing but that's what it's called.basically the way it works is:

  • 识别一个资源(如“连接”),很多事情需要发生在connectionis /完成初始化
  • 使一个类的连接
  • 把所有在构造函数中初始化/完成代码/析构函数
  • 确保在适当的时候调用对象的析构函数方法!(通过删除它从avector /有它的范围)

以前我知道使用这种模式的明显的事情(确保所有memorygets析构函数释放,或确保文件描述符关闭)。但我没有意识到它也是有用的情况下,稍微不那么明显的资源像“减量计数器”。

这种模式工作的原因是c++编译器/标准库一堆工作确保,析构函数被调用当你完成一个对象,编译器insertsdestructor调用每个代码块结束时,异常后,和许多标准librarycollections确保调用析构函数,当你删除一个对象集合。

RAII给你提示,确定的,和hard-to-screw-up清理资源

令人兴奋的是,这种编程模式给你的方式安排清洁upresources:

  • 容易保证总是发生(对象消失时,它总是发生,即使有anexception !)
  • 马上提示& determinstic(它发生就一定会有发生!)

RAII什么语言?吗?

c++和锈RAII。可能其他语言。Java,Python,去,和垃圾collectedlanguages一般不会。在垃圾收集语言通常可以设置软件当对象析构函数是GC。但通常(像在这种情况下,连接数)你wantthings清理吗马上当对象不再使用时,不是indeterminateperiod后来每当GC运行。

Python环境经理相关的想法,你可以做一些类似:

康涅狄格州conn_pool.connection():做东西

这就是现在!!

希望这RAII解释术语是有趣,主要是正确的。感谢Kamal clarifyingsome RAII东西给我!!