Объявление внутри метода run() в QThread по сравнению с объявлением локальной переменной в 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()), какой поток владеет «myVariable» при выполнении ThreadA и ThreadB??

Как основной поток и QThread делят ресурсы в таком сценарии??

Каковы область действия и действительность myVariable в QThread (т.е. ThreadA и ThreadB) и его основное приложение??

Спасибо, Вишну.


person Vishnu Pedireddi    schedule 29.03.2011    source источник


Ответы (2)


Во-первых, QThread — это не поток. Это менеджер/контроллер потока. Объект QThread всегда создается в потоке, отличном от потока, которым он собирается управлять.

Предполагая, что оба ваших пользовательских объекта QThread созданы в основном потоке графического интерфейса, ThreadA::myVariable будет размещен в своем собственном потоке. В то время как ThreadB::myVariable будет выделен в основном потоке.

То, как вы можете обмениваться информацией между потоками, зависит от доступа, необходимого для каждого потока. Если он всегда читается одним потоком и записывается другим, вы сможете обойтись простой функцией доступа к членам. Если он может быть записан обоими потоками, то необходима блокировка мьютекса. QReadWriteLock обеспечивает четкую семантику и некоторую оптимизацию для этого.

Вы также можете использовать событие и сигнал для отправки данных через поток. Доставка события является потокобезопасной и при правильном подключении, как и сигнал.

person Stephen Chu    schedule 29.03.2011

При использовании потоков всегда помните: Все данные распределяются между потоками Программирование потоков (c/c++) — это отдельные данные, многократное выполнение.

Нет определения принадлежности данных потокам. Все ресурсы процесса, включая память, могут быть доступны из каждого потока каждый раз. Доступ к ресурсам должен регулироваться программистом с помощью инкапсуляции, мьютексов, развязки сигнал-слот и т. д.

Вы, вероятно, знаете это, и я не хочу звучать покровительственно. Но определение того, к каким данным в программе никогда не обращаются более чем из одного потока, и какие данные доступны (или могут быть доступными), является наиболее важным вопросом в многопоточном программировании.

person Volker    schedule 29.03.2011