应用程序中有很多线程会适得其反吗?

Is having a lot of threads in an application counter productive?

我目前正在尝试实现一个供个人使用的多线程数据库连接接口。这是使用 3 类

实现的

到目前为止,这种架构在线程数量有限(通常少于 10 个连接)的情况下取得了很大的成功。我的主要问题是,如果我有 100 多个连接,我不知道它会如何表现,这意味着一个应用程序有 100 多个线程,这带来了我的主要问题

应用程序中有很多线程会适得其反吗?如果同时打开 50/100/500/1000 个连接会怎样?如果我这样做,I/O 数据库操作将花费大量时间才能完成(它首先不是为此设计的)但是有多少延迟是由线程数量引起的?

我会说是的,它适得其反。每个线程都为其堆栈占用了大量内存 space,如果您只有 6 个内核,则无论如何都无法 运行 100 多个线程并行。改用线程池,例如通过 KF5 ThreadWeaver 或 Qt Concurrent 并注意理想的线程数。

线程数本身并不是一个大问题。每个都使用一些内存,但对于现代机器来说,开销并不大。

当所有这些线程开始尝试同时工作时,主要问题就来了,它们开始争夺资源,而您最终得到的结果可能比从更智能地工作的少量线程中获得的结果更慢。

线程池是这种情况的常见解决方案,其中任务排队等待执行,并且您有一个线程池,其中包含适合您机器的线程数(例如每个内核一个线程)处理队列外的项目。如果您的线程花费大量时间空闲等待响应,那么可能需要更多线程,如果它们一直在进行计算,那么添加更多线程实际上可能会减慢速度。

测量性能并相应地调整 :) "Gut feel" 在处理性能时非常不可靠。