进行昂贵的初始化的最佳方法是什么?

霍华德·辛南特

我有一个单例,初始化起来很昂贵:

struct X {...};

const X&
get_X()
{
    static const X x = init_X();
    return x;
}

第一次get_X()调用时,可能需要花费数百毫秒的时间来初始化函数本地静态变量。但是完成之后,我需要做的事情X相对较快:

get_X().find_something_for_me();  // expensive if this is the first call
get_X().find_something_for_me();  // now fast

如何最大程度地减少首次致电时的较大延迟get_X()我有很多核心...

霍华德·辛南特

一旦您的应用程序启动,并且(有希望)在您实际需要调用之前get_X(),免费地调用它。此外,为了使您的初始化阶段更快,请将昂贵的初始化反馈给不同的线程。例如:

#include <thread>

int
main()
{
    std::thread(get_X).detach();
    // continue with other initialization...
}

当某些任务的成本高达几百毫秒(或更多)时,拆分线程来处理它的开销就在噪声级别。而且,如果您使用的是多核硬件(如今还不是现在?),那么如果您的应用程序从此单例开始直到get_X完成首次调用实际上不需要任何东西,那么这显然是性能上的胜利

注意事项/问题:

  • 为什么detachthread为什么不join呢?

    如果您决定join这样做thread,那意味着您只需要等待它完成即可,为什么不做其他事情呢。完成detach后,请自行清理。您甚至不需要保留的句柄thread临时std::thread破坏,但OS线程继续运行,get_X直到完成。

    thread标准化时,有人认为detachedthread不仅无用,而且很危险。但是,这里是detachedthread一个非常安全且颇具启发性的用例

  • 如果我的应用程序get_X()detachedthread完成第一个调用之前调用了该get_X()怎么办?

    有性能方面的打击,但没有正确性方面的打击。您的应用程序将在此行中阻塞get_X()

    static const X x = init_X();

    直到detachedthread完成执行。因此,没有数据争用。

  • 如果我的申请在detachedthread完成之前结束怎么办?

    如果您的应用程序在初始化阶段结束,则显然发生了灾难性的错误。如果get_X碰到已经被at_exit破坏的东西(在main之后执行),就会发生不好的事情。但是,您已经处于紧急关闭状态...再次发生紧急情况不太可能使您的紧急关闭更加严重。你已经死了 Otoh,如果初始化需要花费几分钟到几小时的时间,那么您可能确实需要更好地交流有关何时完成初始化的信息,以及更合理的关闭程序。在那种情况下,您需要在线程中实现协作取消,无论线程是否分离(std委员会拒绝为您提供)。

  • 如果第一个调用get_X()引发异常怎么办?

    在这种情况下,get_X()假设您没有保留未捕获的异常并允许其终止程序则对它的第二次调用就有机会初始化函数local static。它可能会抛出,或者可能会成功初始化(取决于您的代码)。无论如何,对的调用get_X()将继续尝试初始化,等待初始化进行中,直到有人设法做到这一点而没有引发异常。无论调用是否来自不同的线程,这都是事实。

综上所述

std::thread(get_X).detach();

这是一种利用多个内核的功能来尽快获得独立的昂贵初始化的好方法,而又不会损害线程安全性的正确性。

唯一的缺点是,get_X()无论是否需要,都可以在其中初始化数据因此,在使用此技术之前,请确保您将需要它。


[脚注]对于使用Visual Studio的用户,这是转向VS-2015的良好动力。在此版本之前,VS不实现线程安全的函数局部静态变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Python

在Python中初始化dict的最佳方法是什么?

来自分类Dev

推迟类属性初始化的最佳方法是什么?

来自分类Java

初始化Quartz的最佳方法是什么?

来自分类Java

初始化bean的最佳方法是什么?

来自分类Dev

在TensorFlow中初始化变量的最佳方法是什么?

来自分类Dev

初始化数组“ memset”或“ {// value}”的最佳方法是什么?

来自分类Dev

进行复杂初始化的pythonic方法是什么

来自分类Dev

初始化对象时传递方法的最佳方法是什么

来自分类Dev

在Ada中初始化固定长度字符串的最佳方法是什么?

来自分类Java

在班级中初始化记录器的最佳方法是什么?

来自分类Java

使用Arrays.asList()初始化列表的最佳方法是什么

来自分类Dev

在类中初始化以下实例的最佳方法是什么?

来自分类Dev

初始化我想跨多个线程共享的静态对象的最佳方法是什么

来自分类Python

跨Python类初始化和使用常量的最佳方法是什么?

来自分类Dev

初始化值为std :: vector的std :: map的最佳方法是什么?

来自分类Dev

测试类静态初始化程序的最佳方法是什么?

来自分类Dev

从初始化列表填充boost :: multi_array的最佳方法是什么?

来自分类Dev

在Vue项目中包括或初始化jQuery库的最佳方法是什么?

来自分类Dev

使用Nuxt.js时,动态Vuex模块初始化的最佳方法是什么?

来自分类Dev

在 React 中加载 DOM 后定义/初始化变量的最佳方法是什么?

来自分类Dev

用不可变且没有初始化程序的参数对方法进行单元测试的最佳方法是什么?

来自分类Dev

我可以在类外部初始化数组实例变量吗?以下代码的最佳OOP方法是什么?

来自分类Dev

用Ecmascript 6中省略值的默认值初始化对象的最佳方法是什么?

来自分类Dev

最小化Google Dataproc上Apache Spark作业的初始化时间的最佳方法是什么?

来自分类Dev

用Modal上的自定义值初始化ReactNative中的状态的最佳方法是什么?

来自分类Dev

重新初始化向量的最快方法是什么?

来自分类Dev

初始化我的数字变量的正确方法是什么?

来自分类Dev

部分初始化结构的正确方法是什么?

来自分类Dev

在C ++中初始化变量的正确方法是什么

Related 相关文章

  1. 1

    在Python中初始化dict的最佳方法是什么?

  2. 2

    推迟类属性初始化的最佳方法是什么?

  3. 3

    初始化Quartz的最佳方法是什么?

  4. 4

    初始化bean的最佳方法是什么?

  5. 5

    在TensorFlow中初始化变量的最佳方法是什么?

  6. 6

    初始化数组“ memset”或“ {// value}”的最佳方法是什么?

  7. 7

    进行复杂初始化的pythonic方法是什么

  8. 8

    初始化对象时传递方法的最佳方法是什么

  9. 9

    在Ada中初始化固定长度字符串的最佳方法是什么?

  10. 10

    在班级中初始化记录器的最佳方法是什么?

  11. 11

    使用Arrays.asList()初始化列表的最佳方法是什么

  12. 12

    在类中初始化以下实例的最佳方法是什么?

  13. 13

    初始化我想跨多个线程共享的静态对象的最佳方法是什么

  14. 14

    跨Python类初始化和使用常量的最佳方法是什么?

  15. 15

    初始化值为std :: vector的std :: map的最佳方法是什么?

  16. 16

    测试类静态初始化程序的最佳方法是什么?

  17. 17

    从初始化列表填充boost :: multi_array的最佳方法是什么?

  18. 18

    在Vue项目中包括或初始化jQuery库的最佳方法是什么?

  19. 19

    使用Nuxt.js时,动态Vuex模块初始化的最佳方法是什么?

  20. 20

    在 React 中加载 DOM 后定义/初始化变量的最佳方法是什么?

  21. 21

    用不可变且没有初始化程序的参数对方法进行单元测试的最佳方法是什么?

  22. 22

    我可以在类外部初始化数组实例变量吗?以下代码的最佳OOP方法是什么?

  23. 23

    用Ecmascript 6中省略值的默认值初始化对象的最佳方法是什么?

  24. 24

    最小化Google Dataproc上Apache Spark作业的初始化时间的最佳方法是什么?

  25. 25

    用Modal上的自定义值初始化ReactNative中的状态的最佳方法是什么?

  26. 26

    重新初始化向量的最快方法是什么?

  27. 27

    初始化我的数字变量的正确方法是什么?

  28. 28

    部分初始化结构的正确方法是什么?

  29. 29

    在C ++中初始化变量的正确方法是什么

热门标签

归档