在应用程序计数器中有很多线程有效吗?

时间:2015-12-02 10:49:11

标签: c++ multithreading performance qt qthread

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

实现的
  • DatabaseManager数据库连接实例为每个连接实例化一个新线程
  • Database一个继承自QThread的对象,意味着在主线程中运行并公开一个接口来处理一个worker对象
  • DatabaseWorker在管理单个数据库连接的工作线程中运行事件循环的工作对象,等待查询并通过Qt:QueuedConnections(signal / slots)传递结果
  • 当不再使用连接时(显式调用close()方法),它的相关事件循环将停止并删除该线程。其目的是将线程创建和删除保持在最低限度。
迄今为止,这种架构在线程数量有限(通常少于10个连接)方面取得了很大成功。我的主要问题是,如果我有100多个连接意味着一个应用程序的100多个线程带来了我的主要问题,我就不知道它会如何表现

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

2 个答案:

答案 0 :(得分:2)

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

当所有这些线程开始尝试一次完成工作时,主要问题就出现了,他们开始争取资源,最终结果会比较少的线程更聪明地得到更快的结果。

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

测量性能并相应调整:)“Gut feel”在演奏时非常不可靠。

答案 1 :(得分:0)

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