考虑以下代码片段:
class ThreadA::QThread
{
public:
ThreadA()
{
}
void run()
{
myVariable = new int();
*myVariable = 10;
}
void Set(int var)
{
*myVariable = var;
}
private:
int* myVaraible;
}
以及以下代码:
class ThreadB::QThread
{
public:
MyThreadB()
{
}
void run()
{
myVariable = 10;
}
void Set(int var)
{
myVariable = var;
}
private:
int myVaraible;
}
我知道互斥锁、竞争条件等的一般理论,
假设 Set 总是在线程启动后调用,(即在调用 run() 之后),哪个线程在 ThreadA 和 ThreadB 的执行中拥有“myVariable”??
这样的场景下主线程和QThread如何共享资源?
myVariable 在 QThread(即 ThreadA 和 ThreadB)及其主要应用中的范围和有效性是什么??
谢谢, 毗湿奴。
最佳答案
首先,QThread 不是线程。它是线程的管理器/ Controller 。 QThread 对象总是在与其要控制的线程不同的线程中创建。
假设您的两个自定义 QThread 对象都是在主 GUI 线程中创建的,则 ThreadA::myVariable 将在其自己的线程中分配。而ThreadB::myVariable将在主线程中分配。
如何在线程之间共享信息取决于每个线程所需的访问权限。如果它总是由一个线程读取并由另一个线程写入,那么您应该能够摆脱简单的成员访问函数。如果两个线程都可以写入,那么就需要互斥锁。 QReadWriteLock 提供了清晰的语义并对此进行了一些优化。
您还可以使用事件和信号跨线程发送数据。事件的传递是线程安全的,并且连接正确,信号也是如此。
关于multithreading - 在 QThread 中的 run() 方法内部声明与在 QThread 中声明为局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5466737/