标题:多线程中任务让谁处理比较高效(Qt为例)
作者:leamus
日期:2021-07-01 18:38
内容:
@(目录)
# 一、前言
命名这个博客的名称也让我费了点时间,因为之前我在网上找过相关资料,但并没有这方面的资料和讨论,也可能是我太钻牛角尖非要搞个清楚。之前我做IOCP库的时候,想把这个高并发网络库做的更精益求精,用了很多晦涩的逻辑和技术来实现无锁化,但这只是建立在我一直认为发送事件的效率比锁的速度要快,今天终于有时间来验证一下这个想法,但结果却让我大跌眼镜。当然也有可能是我的思路或者方法有问题,希望有大神了解这方面的可以指点指教。
# 二、验证目的
因为IOCP的实现中,会开多个工作线程来接受数据和处理任务,也会遇到处理临界区资源的情况,我的无锁化实现实质就是将这些数据都Post给主线程,让主线程来处理所有的任务,这样的好处就是让工作线程尽快回到队列中取数据,且主线程处理任务就不用加锁,运行效率会更高(我自认为的)。现在为了验证到底是工作线程加锁来处理任务、还是工作线程将任务Post给主线程的效率高。
# 三、验证流程
为了简化程序,我只用了一个工作线程和主线程来完成验证,任务很简单,就是给一个全局变量加1,直到给定的一个最大值。
## 1、工作线程直接无锁处理
这个是最快速的,让我们先看看最快的速度是多少。
相关代码:
```cpp
#define COUNT 5000000
void run()
{
while(count exit();
}
```
测试结果为**15ms**左右。
## 2、工作线程加锁处理
假设变量count是个临界区,对它修改时要加锁。
相关代码:
```cpp
#define COUNT 5000000
void run()
{
while(1)
{
mutex.lock();
if(count
#1 [snow_man_0 07-01 19:03]
我觉得线程运行独立,尽量不要让事件干扰
#2 回 snow_man_0 的帖子 [leamus 07-01 19:12]
snow_man_0:我觉得线程运行独立,尽量不要让事件干扰 (2021-07-01 19:03)
要分情况,一般线程可以处理特定的一个任务,运行完毕后退出,但有些线程可以开启事件循环来等待事件,比如主要处理IO的线程就等待IO事件。
#3 [kaon 07-02 09:44]
应该比较调用5000000次函数和调用5000000次信号槽的时间吧
#4 回 kaon 的帖子 [leamus 07-02 19:53]
kaon:应该比较调用5000000次函数和调用5000000次信号槽的时间吧
(2021-07-02 09:44)
很明显调用函数要比调用信号槽快得多,函数调用基本都可以忽略了。而且这两个比较没什么意义,前者只是代码执行跳转,后者是一种设计模型。
#5 [kaon 07-02 20:33]
我这边测试没你这么夸张,基本上用sigslot比mutex慢3倍这样