请考虑以下代码段:
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如何共享资源?
QThread(即ThreadA和ThreadB)中myVariable的范围和有效性及其主要应用是什么?
谢谢, 毗
答案 0 :(得分:2)
首先,QThread不是一个线程。它是线程的管理器/控制器。 QThread对象总是在一个与它要控制的线程不同的线程中创建。
假设在主GUI线程中创建了两个自定义QThread对象,ThreadA :: myVariable将在其自己的线程中分配。而ThreadB :: myVariable将在主线程中分配。
如何在线程之间共享信息取决于每个线程所需的访问权限。如果它总是由一个线程读取并由另一个线程写入,那么您应该能够使用简单的成员访问功能。如果它可以由两个线程写入,则需要互斥锁。 QReadWriteLock为此提供了清晰的语义和一些优化。
您还可以使用事件和信号跨线程发送数据。事件的传递是线程安全的,并且连接正确,信号也是如此。
答案 1 :(得分:1)
使用线程时请始终牢记:所有数据在线程之间共享线程编程(c / c ++)是单个数据,多次执行。
没有对线程数据所有权的定义。可以每次从每个线程访问包括存储器的所有进程'资源。程序员必须使用封装,互斥,信号槽去耦等来调节对资源的访问
你可能知道这一点,我不想听起来光顾。但是,告诉程序中的哪些数据永远不会从多个线程访问,哪些数据是(或可能是),这是多线程编程中最关键的问题。