multithreading - 在 QThread 中的 run() 方法内部声明与在 QThread 中声明为局部变量

标签 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如何共享资源?

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/

相关文章:

c++ - dbus session connections : connecting dbus signals with qt slots, 怎么办?

c++ - 画一个里面有数字的实心圆

java - 对象发布保证线程安全

java - Android中HandlerThread的安全性

使用 Process() 和多线程的 Swift 命令行工具在一定数量的执行轮次(~3148)后崩溃

C# Readonly List 线程同步

qt - 将 Qxt 插件添加到 Designer

python - urllib2 和 cookielib 线程安全

c++ - 关闭在线程上运行的 GStreamer RTSP 服务器

java - 除非程序员显式创建线程或 Runnable 的实现,否则所有 Java 应用程序都是单线程的吗?