【问题标题】:Can multi-threading improve the performance definitely多线程肯定能提高性能吗
【发布时间】:2022-01-10 12:56:41
【问题描述】:

我正在使用 C++11 开发一个项目。

在某些功能中,我得到了一些并行任务如下:

void func() {
    auto res1 = task1();
    auto res2 = task2();
    auto res3 = task3();
    ...
    std::cout << res1 + res2 + res3 + ...;
}

嗯,每个任务都有点繁重,假设每个任务会花费 300 毫秒。

现在我认为将每个任务设为std::thread 应该会提高性能。

但据我了解,调度线程的是操作系统。 我不确定操作系统是否确保它会立即执行这些线程或者它可能需要等待一些其他的东西?

所以我的问题是,如果让任务多线程确实可以提高性能,或者在某些情况下,这种方法会得到更差的性能?

顺便说一句,我知道线程过多会因为上下文切换而导致性能非常差,在我的实际情况下,任务的数量少于 10 个并且它们不共享任何数据。

【问题讨论】:

  • 没有通用的答案,结果取决于太多的因素(例如线程创建的延迟、CPU 内核的数量等)。你为什么不简单地衡量两个选项?顺便说一句,std::async 似乎比std::thread 更适合您的情况。
  • 你试过了吗?您是否查看过任何文档(想到 cppreference.com)?此外,当某些部分是实现定义的时,答案可能是“取决于”。请放心,任何普通操作系统都可以在不同的 CPU 上运行线程,即完全并行。

标签: c++ multithreading performance c++11


【解决方案1】:

我不确定操作系统是否确保它会执行这些线程 立即或它可能需要等待一些其他的东西?

操作系统将尝试尽快启动线程。不能保证它们在您的 thread 对象的构造函数构造函数返回的确切时刻已经运行,但是操作系统也不会在启动它们之前故意等待。 (例如,在负载不严重的系统上,您通常可以期望它们在几毫秒内运行)

所以我的问题是,如果使任务多线程绝对可以 提高性能,或者在某些情况下,这种方法会得到一个 性能更差?

在程序中添加多线程并发现您的程序实际上比单线程版本需要更长的时间才能完成,这实际上是一种相当普遍的体验,尤其是对于刚接触多线程编程的程序员而言。

这类似于在厨房里增加更多的厨师——如果厨师们合作得当并且彼此不妨碍,他们可以在更短的时间内烹饪更多的食物,但如果他们不这样做,他们很可能会花费最多他们的时间等待对方完成使用各种工具/配料,或者谈论谁应该做什么,最终比一个厨师要慢。

一般来说,多线程可以加快速度,如果您在多核系统上运行,并且您的各个线程不需要过多地相互通信,并且线程不需要太频繁地获得对共享资源的独占访问,并且您的线程没有做任何效率极低的事情(如密集轮询或忙等待)。这些条件是容易实现还是困难,很大程度上取决于您要完成的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多