查看完整版本: [-- QT多线程互斥变量是否有支持自旋锁的功能? --]

QTCN开发网 -> Qt基础编程 -> QT多线程互斥变量是否有支持自旋锁的功能? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

wwwfffhhh 2021-05-07 22:46

QT多线程互斥变量是否有支持自旋锁的功能?

qt的QMutex变量没有看到设置自旋锁的函数,也就是类似window系统的 InitializeCriticalSectionAndSpinCount(...)的设置自旋锁的参数,不知道QT是否有类似这种互斥量?

wwwfffhhh 2021-05-07 22:48
程序需要在Linux系统下运行,并且我现在QT编写的程序需要多线程高性能处理,所以需要设置这个参数,不知道有什么方法解决?

snow_man_0 2021-05-07 22:56
wwwfffhhh:程序需要在Linux系统下运行,并且我现在QT编写的程序需要多线程高性能处理,所以需要设置这个参数,不知道有什么方法解决? (2021-05-07 22:48) 

Qt多线程计算和OPENMP的性能差不多的

wwwfffhhh 2021-05-08 09:18
你的意思是QMutext内部已经设置了自旋锁吗?否则CPU总是需要线程核心态和用户态切换的,所以就比较慢?

deepgui 2021-05-08 11:33
你觉得不够可以使用C++里的mutex

realfan 2021-05-10 17:15
自旋锁,可以用C++自己写一个,网上也很多。

#include <atomic>
class SpinLock {
  public:
    SpinLock() : _flag(false) {}
    void lock() {
        bool expect = false;
        while (!_flag.compare_exchange_weak(expect, true)) {
            expect = false;
        }
    }

    void unlock() {
        _flag.store(false);
    }

  private:
    std::atomic<bool> _flag;
};


wwwfffhhh 2021-05-12 08:51
realfan:自旋锁,可以用C++自己写一个,网上也很多。
#include <atomic>
class SpinLock {
  public:
....... (2021-05-10 17:15) 

虽然上方的程序线程会等待释放“锁”,但它是死循环等待,如果其它线程可能会花一段时间才会释放”锁“,那么这个CPU利用率就非常高,程序性能反而可能变得很差。


我希望的是线程只会等待少量时间(即可以设置自旋循环等待一定的次数),如果超过这个次数就线程休眠了

realfan 2021-05-12 10:05
wwwfffhhh:虽然上方的程序线程会等待释放“锁”,但它是死循环等待,如果其它线程可能会花一段时间才会释放”锁“,那么这个CPU利用率就非常高,程序性能反而可能变得很差。
我希望的是线程只会等待少量时间(即可以设置自旋循环等待一定的次数),如果超过这个次数就线程休眠了 (2021-05-12 08:51) 

自旋锁应用场景,就是在等待时间很短的情形。否则就用普通锁。可以考虑用混合锁,先自旋一定时间,未取得,再进入互斥休眠。

wwwfffhhh 2021-05-13 20:40
realfan:自旋锁应用场景,就是在等待时间很短的情形。否则就用普通锁。可以考虑用混合锁,先自旋一定时间,未取得,再进入互斥休眠。 (2021-05-12 10:05) 

你说得很对,但我现在就是没有找到“再进入互斥休眠”的代码程序

realfan 2021-05-14 14:06
wwwfffhhh:你说得很对,但我现在就是没有找到“再进入互斥休眠”的代码程序 (2021-05-13 20:40) 

我见过有用std::mutex 先try_lock一定次数,或一定时间的,如果仍然未成功,再调用lock

但这种方式,效率如何,还是需要验证

deepgui 2021-05-16 23:09
如果程序用线程有互锁问题,是程序设计问题。很多是逻辑问题,最好是从逻辑上去解决。

wwwfffhhh 2021-08-14 23:40
基本自己解决了这个自旋锁的问题,就是自己定义一个类,封装了了原来的QRecursiveMutex。
参考代码如下:

    class QRecursiveMutexWithSpin
    {
    public:
        explicit QRecursiveMutexWithSpin(quint32 SpinCount_i)
            :SpinCount(SpinCount_i)
        {
        }

        inline void lock()
        {
            for(quint32 i = 0; i < SpinCount; i++)
            {
                if(InnerRecursiveMutext.tryLock())
                    return;
            }

            InnerRecursiveMutext.lock();
        }

        inline void unlock()
        {
            InnerRecursiveMutext.unlock();
        }

    private:
        QRecursiveMutex InnerRecursiveMutext;
        quint32 SpinCount = 0;//自旋次数
    };



查看完整版本: [-- QT多线程互斥变量是否有支持自旋锁的功能? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled