Объявление внутри метода run () в QThread против объявления в QThread локальной переменной - PullRequest
2 голосов
/ 29 марта 2011

Рассмотрим следующие фрагменты кода:

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) и его основном приложении ??

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

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

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

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

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

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

1 голос
/ 29 марта 2011

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

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

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

...