Déclarer à l'intérieur de la méthode RUN () dans QThread vs déclarant une variable locale dans QThread

StackOverflow https://stackoverflow.com/questions/5466737

Question

Considérez les extraits de code suivants:

class ThreadA::QThread
{
  public:
  ThreadA()
  {
  }
  void run()
  {
    myVariable = new int();
    *myVariable = 10;
  }

  void Set(int var)
  {
    *myVariable = var;
  }
  private:
  int* myVaraible;
 }

et le code suivant:

class ThreadB::QThread
{
  public:
  MyThreadB()
  {
  }
  void run()
  {
     myVariable = 10;
  }

  void Set(int var)
  {
     myVariable = var;
  }

  private:
  int myVaraible;
 }

Je connais la théorie générale des mutex, l'état de race, etc.,

En supposant que l'ensemble est toujours appelé après le démarrage du thread (c'est-à-dire après un appel à exécuter ()), quel thread possède "myvariable" dans l'exécution de Threada et Threadb ??

Comment le thread principal et le QThread partagent-ils des ressources dans un tel scénario ??

Quelle est la portée et la validité de MyVariable dans le QThread (c'est-à-dire Threada et Threadb) et son application principale ??

Merci, Vishnu.

Était-ce utile?

La solution

Tout d'abord, un QThread n'est pas un fil. C'est le gestionnaire / contrôleur d'un fil. Un objet QThread est toujours créé dans un thread différent du thread qu'il va contrôler.

En supposant que vos deux objets QThread personnalisés sont créés dans le thread GUI principal, Threada :: MyVariable sera alloué dans son propre fil. Tandis que ThreadB :: MyVariable sera alloué dans le fil principal.

La façon dont vous pouvez partager des informations entre les threads dépend des accès dont vous avez besoin à partir de chaque threads. S'il est toujours lu par un fil et écrit par un autre, vous devriez pouvoir vous en sortir avec une fonction d'accès simple. S'il peut être écrit par les deux threads, un verrou de mutex est nécessaire. QReadWriteLock fournit un sémantique clair et une certaine optimisation pour cela.

Vous pouvez également utiliser l'événement et le signal pour envoyer des données sur le thread. La livraison de l'événement est sûre et avec une connexion appropriée, il en va de même pour le signal.

Autres conseils

Lorsque vous utilisez des threads, gardez toujours à l'esprit: Toutes les données sont partagées entre les threads La programmation des threads (C / C ++) est une seule données, une exécution multiple.

Il n'y a pas de définition de la propriété des données aux threads. Toutes les ressources d'un processus, qui incluent la mémoire, sont accessibles à partir de chaque fil à chaque fois. L'accès aux ressources doit être régulé par le programme

Vous le savez probablement et je ne veux pas paraître condescendant. Mais dire quelles données dans un programme ne sont jamais accessibles à partir de plus d'un thread et quelles données sont (ou pourrait être) le problème le plus crucial de la programmation multithread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top