【问题标题】:What kind of overhead to c++11 threads introduce?c++11线程引入了什么样的开销?
【发布时间】:2014-04-27 03:43:22
【问题描述】:

来自 C#/Java 编程,在程序中创建新线程往往会增加大量开销(例如 C# 中每个线程 1MB)。我很好奇 C++11 线程会引入什么样的开销。

【问题讨论】:

  • 虚拟内存通常不被视为稀缺资源。
  • @DavidSchwartz 在 32 位以下。事实上,当动态内存碎片化时,长时间运行的进程可能(并且确实)死于地址空间不足。

标签: c++ multithreading


【解决方案1】:

C++ 在底层实现之上提供了一个相当薄的包装器,不会导致显着的额外开销。实际上,您甚至可以将get a handle 传递到底层操作系统线程,这将是一个__gthread_t,它是g++ 的pthread 句柄和Visual C++ 的WINAPI 线程句柄。

但是,线程确实具有内在开销,因为它们需要由操作系统调度、包含堆栈等等。

An analysis by Mark Russinovich 突破了 Windows 下线程创建的限制。这些限制当然是由线程开销引起的,并给出:

  • 一个线程需要大约 1 MB 的虚拟地址空间(默认链接器设置)
  • 4-16 KB 的初始提交大小
  • 12-48 KB 不可分页内存

【讨论】:

  • 另外,应该注意的是,std::thread 的瘦包装看起来很像 boost::thread,对于某些机器来说它只是 pthread 的包装。
  • @It'sPete 事实上,std::thread 是 pthread 的一个非常薄的包装器,以至于 gcc 和 clang 都需要添加 -lpthread 才能使用它;)
【解决方案2】:

这里已经解决了:

How much overhead is there when creating a thread?

悬崖笔记:这将取决于系统,最好的了解方法是在您的目标系统上进行基准测试。

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多