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;
 }

ミューテックス、レースコンディションなどの一般的な理論を知っています。

スレッドが開始された後 (つまり、run() の呼び出し後) に Set が常に呼び出されると仮定すると、ThreadA と ThreadB の実行で "myVariable" を所有するスレッドはどれですか??

このようなシナリオで、メイン スレッドと QThread はどのようにリソースを共有しますか??

QThread (つまり、ThreadA と ThreadB) およびその主なアプリケーション内での myVariable の範囲と有効性は何ですか??

ありがとう、ヴィシュヌ。

4

2 に答える 2

2

まず、QThread はスレッドではありません。スレッドのマネージャー/コントローラーです。QThread オブジェクトは、制御しようとしているスレッドとは異なるスレッドで常に作成されます。

両方のカスタム QThread オブジェクトがメイン GUI スレッドで作成されていると仮定すると、ThreadA::myVariable は独自のスレッドに割り当てられます。ThreadB::myVariable はメインスレッドに割り当てられます。

スレッド間で情報を共有する方法は、各スレッドから必要なアクセスによって異なります。常にあるスレッドによって読み取られ、別のスレッドによって書き込まれる場合は、単純なメンバー アクセス関数で回避できるはずです。両方のスレッドで書き込み可能な場合は、mutex ロックが必要です。QReadWriteLock は、明確なセマンティクスとその最適化を提供します。

イベントとシグナルを使用して、スレッド間でデータを送信することもできます。イベントの配信はスレッド セーフであり、適切に接続されているため、シグナルも同様です。

于 2011-03-29T12:23:41.403 に答える
1

スレッドを使用するときは、常に次の点に注意してください。すべてのデータはスレッド間で共有されます。スレッド プログラミング (c/c++) は、単一データの複数実行です。

スレッドに対するデータの所有権の定義はありません。メモリを含むプロセスのすべてのリソースは、毎回すべてのスレッドからアクセスできます。リソースへのアクセスは、カプセル化、ミューテックス、シグナルスロットのデカップリングなどを使用して、プログラマーが規制する必要があります。

あなたはおそらくこれを知っており、私はひいきに聞こえたくありません. しかし、プログラム内のどのデータが複数のスレッドから決してアクセスされず、どのデータがアクセスされるか (またはアクセスされる可能性があるか) を示すことは、マルチスレッド プログラミングにおける最も重要な問題です。

于 2011-03-29T15:32:03.453 に答える