在QThread中声明run()方法,并在QThread中声明为局部变量

时间:2011-03-29 00:54:18

标签: multithreading qt thread-safety qthread

请考虑以下代码段:

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的范围和有效性及其主要应用是什么?

谢谢, 毗

2 个答案:

答案 0 :(得分:2)

首先,QThread不是一个线程。它是线程的管理器/控制器。 QThread对象总是在一个与它要控制的线程不同的线程中创建。

假设在主GUI线程中创建了两个自定义QThread对象,ThreadA :: myVariable将在其自己的线程中分配。而ThreadB :: myVariable将在主线程中分配。

如何在线程之间共享信息取决于每个线程所需的访问权限。如果它总是由一个线程读取并由另一个线程写入,那么您应该能够使用简单的成员访问功能。如果它可以由两个线程写入,则需要互斥锁。 QReadWriteLock为此提供了清晰的语义和一些优化。

您还可以使用事件和信号跨线程发送数据。事件的传递是线程安全的,并且连接正确,信号也是如此。

答案 1 :(得分:1)

使用线程时请始终牢记:所有数据在线程之间共享线程编程(c / c ++)是单个数据,多次执行。

没有对线程数据所有权的定义。可以每次从每个线程访问包括存储器的所有进程'资源。程序员必须使用封装,互斥,信号槽去耦等来调节对资源的访问

你可能知道这一点,我不想听起来光​​顾。但是,告诉程序中的哪些数据永远不会从多个线程访问,哪些数据是(或可能是),这是多线程编程中最关键的问题。