QSingleApplication
?QMutex
?QSharedMemory
?我正在寻找能在Windows,OSX和Linux(Ubuntu)中顺利运行的东西.使用Qt 4.7.1
我是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
.
现在我的问题:
我如何可以共享counter
的thread_a
和thread_b
使用QMutex
?
我有Document
代表自定义文档的线程安全类.它有getter(const函数)和setter来修改它的状态.所有这些函数都受互斥保护,以保证在完全执行该方法之前文档不会更改.
但由于QMutex
使用,我无法将状态访问功能标记为const
不mutable
使用.捕捉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) 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) 从多个线程调用以下附加函数。我不希望数据重写追加,因为计数器尚未增加。
除了当前使用 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) 我有一个函数,它是类的一部分,在这个函数中,在函数的开头有一个mutex.lock,在它返回之前有一个mutex.unlock.现在我遇到了互斥锁卡在锁定状态的情况.如果这个函数是我使用该互斥锁来锁定和解锁的唯一地方,那么可以做什么呢.该函数从主线程和1或2个其他QThreads调用.
更新:问题是由于线程没有在函数调用之间休眠.也许缺乏睡眠很快就重新锁定了互斥锁?你也可以调用yieldCurrentThread();
我有一个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)