谷歌C ++编码风格,没有例外规则。多线程怎么样?

时间:2013-09-29 01:12:53

标签: c++ multithreading

Google C++ coding style建议不要使用C ++异常,我们也不会使用它们。对于大多数STL库容器,可以忽略异常,因为通常它们表示严重错误并且难以处理,因此崩溃是可以接受的。

但是多线程(std :: thread)存在问题,例如,两次输入非递归互斥锁会引发异常。这种情况并不重要,可以通过等待来处理。

我的问题是:有谁知道Google使用什么作为线程库?是否有任何C ++跨平台线程库不使用异常?

谢谢

4 个答案:

答案 0 :(得分:13)

应该注意的是,谷歌的风格指南并不排除处理例外而不是抛出异常。即处理问题,但不要通过抛出更多例外来使情况变得更糟。

在重新输入非递归互斥锁的情况下:这显然是一个程序员错误,而不是一些意外的蓝色螺栓。应允许异常传播到调用代码,以便可以将其视为错误处理。应该注意的是,Google Test框架不依赖于异常,但它肯定可以捕获并报告它们。

虽然Google的样式指南占据了极端的位置,但毫无疑问,在编写可重用的库时,异常可能会出现问题。例如,我们发现使用WinCE 6.0进行开发时,在重新抛出时会出现异常,并且在ARM平台上无法可靠地抛出DLL边界。此外,捕获异常可能需要几毫秒,因此它们绝对不应用于需要实时性能的非特殊情况(即“预期”错误)。真正的名字就是线索。

答案 1 :(得分:11)

Google风格指南中的做法可以追溯到上个世纪九十年代早期,当时线程是相当异国情调的野兽。因此,想知道这种风格和线程如何混合是没有意义的。如果您使用线程等“现代”(21世纪)技术,则不要使用Google的样式指南,反之亦然。

答案 2 :(得分:9)

IIRC Google不使用例外的原因是他们的大部分代码库都不是例外安全的,他们无法承担重写费用。

从他们的网站:

  

从表面上看,使用例外的好处超过了成本,特别是在新项目中。但是,对于现有代码,异常的引入会影响所有依赖代码。如果异常可以传播到新项目之外,那么将新项目集成到现有的无异常代码中也会出现问题。由于Google的大多数现有C ++代码都不准备处理异常,因此采用生成异常的新代码相对比较困难。

     

鉴于Google的现有代码不能容忍异常,使用异常的成本比新项目的成本要高一些。转换过程缓慢且容易出错。我们不相信异常的可用替代方案(例如错误代码和断言)会带来很大的负担。

     

我们反对使用例外的建议不是基于哲学或道德原因,而是基于实际原因。因为我们想在Google上使用我们的开源项目,如果这些项目使用例外情况很难这样做,我们也需要针对Google开源项目中的例外情况提供建议。如果我们不得不从头再做一遍,情况可能会有所不同。

答案 3 :(得分:1)

就个人而言,我更喜欢函数返回代码而不是异常。但不管个人喜好或编码风格如何,重要的是要发现问题,不要让它们传播,坚持或造成混乱。

我所做的,特别是在开发过程中,是在检测任何类型的线程中的任何类型的错误,我得到了冻结自身的过程。在Linux上我提出了SIGSTOP信号。这样做的好处是,我可以附加一个调试器,看看整个过程中的所有破碎的荣耀。