标签: qmutex

Qt:单实例应用程序保护的最佳实践

QSingleApplicationQMutexQSharedMemory?我正在寻找能在Windows,OSX和Linux(Ubuntu)中顺利运行的东西.使用Qt 4.7.1

c++ qt qmutex qsharedmemory

39
推荐指数
3
解决办法
2万
查看次数

如何使用QMutex?

我是Qt的新手,我正在寻找Qt中的多线程.
正如我在Qt Documents中所学到的,我为两个线程定义了两个类:

#include <QThread>
#include <QMutex>

class thread_a : public QThread
{
    Q_OBJECT
public:
    explicit thread_a(QObject *parent = 0);
    int counter;

protected:
    void run();
};
Run Code Online (Sandbox Code Playgroud)

并在CPP文件中:

#include "thread_a.h"

thread_a::thread_a(QObject *parent) :
    QThread(parent)
{
    counter=0;
}

void thread_a::run()
{
    counter++;
}
Run Code Online (Sandbox Code Playgroud)

第二个线程类是相同的,但counter--run()方法中.
然后我运行这两个线程main.ccp.

现在我的问题:
我如何可以共享counterthread_athread_b使用QMutex

c++ qt multithreading mutex qmutex

16
推荐指数
1
解决办法
4万
查看次数

可以将互斥锁定功能标记为const

我有Document代表自定义文档的线程安全类.它有getter(const函数)和setter来修改它的状态.所有这些函数都受互斥保护,以保证在完全执行该方法之前文档不会更改.

但由于QMutex使用,我无法将状态访问功能标记为constmutable使用.捕捉QMutex改变它的状态.

这段代码是正确的,还是可以用更好的方式编写?没有hacky mutable使用.

class Document
{
    // This method should be const: it changes only mutex
    // and don't touch document state
    bool IsCorrect() const;
    ...
    mutable QMutex m_lock;
};

bool Document::IsCorrect() const
{
    // Capturing mutex object change it!
    QMutexLocker lock( &m_lock );
    ... Const-aware code
    bool result = ( m_context != NULL );
    ...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

c++ const thread-safety qmutex

13
推荐指数
1
解决办法
2635
查看次数

MacOS 上的 Multipass 完全损坏 &amp; multipassd 错误日志

com.canonical.multipassd 服务不断在我的 Mac 上记录错误,并且即使在重新安装、重新启动和更新我的 Mac 后,multipass 也根本无法工作。

为了尝试通过多通道在 Linux VM 中使用我的 GPU,我尝试为我的卡 (Radeon Pro 5300 4GB) 安装 AMDGPU 驱动程序。我已经通过 brew 安装了 multipass 并取得了一些进展,但./amdgpu-install由于缺少依赖项,该过程返回了各种错误。开始解决缺失的依赖关系后,试图再次构建驱动程序,构建中途停止,我无法终止进程或让虚拟机完全响应(抱歉,没有截图)。

因此,我关闭了 VM shell 并尝试使用 multipass 来关闭 VM。Multipass 完全停止响应 - 应用程序只是旋转,并且在终端中根本没有响应。我在活动监视器中强制退出多次。这仍然没有解决它,所以我(有点愚蠢)强制退出“hyperkit”和“multipassd”。这就是一切都出了问题的地方。

强制退出“multipassd”后,我尝试重新打开 multipass,但它返回了以下错误

list failed: cannot connect to the multipass socket
Please ensure multipassd is running and '/var/run/multipass_socket' is accessible
Run Code Online (Sandbox Code Playgroud)

我查了一下并尝试了一些建议的解决方案。我用 Brew 卸载了 multipass。我删除了该应用程序,然后用brew重新安装。我也尝试过brew remove multipass,并尝试使用 multipass 网站上的 .pkg 进行安装。当这没有解决问题时,我重新启动了计算机并在启动时重置了 NVRAM。这也没有什么区别,所以我刚刚将我的 Mac 更新到 MacOS 11.4,但它仍然没有修复。

控制台日志表明它multipassd仍在执行某些操作,因为它不断记录在 system.log 中:

May 26 09:39:15 <myName> …
Run Code Online (Sandbox Code Playgroud)

macos virtual-machine multipass qmutex amd-gpu

6
推荐指数
1
解决办法
6233
查看次数

QMutex 是否需要是静态的,以便此类实例的其他线程调用知道挂起它们的操作?

从多个线程调用以下附加函数。我不希望数据重写追加,因为计数器尚未增加。

除了当前使用 Append 的线程之外,这会暂停所有进入的线程吗?或者其他线程会继续运行而不附加数据?

互斥体是否需要“静态”或每个实例都知道暂停操作?

如果我不想打嗝,我假设我必须建立一个缓冲区来备份日志数据?

void classA::Append(int _msg)
{
    static int c = 0;
    QMutex mutex; //need to be static so other threads know to suspend?
                  //there are 10 threads creating an instantiation of classA or an object of classA     

    mutex.lock();

    intArray[c] = _msg;
    c++;

    mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

c++ qt mutex qmutex

5
推荐指数
1
解决办法
3810
查看次数

QMutex处于锁定状态

我有一个函数,它是类的一部分,在这个函数中,在函数的开头有一个mutex.lock,在它返回之前有一个mutex.unlock.现在我遇到了互斥锁卡在锁定状态的情况.如果这个函数是我使用该互斥锁来锁定和解锁的唯一地方,那么可以做什么呢.该函数从主线程和1或2个其他QThreads调用.

更新:问题是由于线程没有在函数调用之间休眠.也许缺乏睡眠很快就重新锁定了互斥锁?你也可以调用yieldCurrentThread();

qt multithreading mutex qmutex

2
推荐指数
1
解决办法
3034
查看次数

QMutex与QThread - 分段故障

我有一个C++ Qt程序,它使用QThread和使用QMutex和QWaitCondition实现的暂停/恢复机制.这就是它的样子:

MyThread.h:

class MyThread : public QThread
{
    Q_OBJECT

    public:
        MyThread();
        void pauseThread();
        void resumeThread();

    private:
        void run();
        QMutex syncMutex;
        QWaitCondition pauseCond;
        bool pause = false;
}
Run Code Online (Sandbox Code Playgroud)

MyThread.cpp:

void MyThread::pauseThread()
{
    syncMutex.lock();
    pause = true;
    syncMutex.unlock();
}

void MyThread::resumeThread()
{
    syncMutex.lock();
    pause = false;
    syncMutex.unlock();
    pauseCond.wakeAll();
}

void MyThread::run()
{
    for ( int x = 0; x < 1000; ++x )
    {
        syncMutex.lock();
        if ( pause == true )
        {
            pauseCond.wait ( &syncMutex );
        }
        syncMutex.unlock();
        //do some work …
Run Code Online (Sandbox Code Playgroud)

c++ qt qthread qmutex

1
推荐指数
1
解决办法
1627
查看次数