2

考虑以下代码片段:

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的范围和有效性是什么?

谢谢,毗湿奴。

4

2 回答 2

2

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

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

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

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

于 2011-03-29T12:23:41.403 回答
1

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

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

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

于 2011-03-29T15:32:03.453 回答