1

プログラムの通知クラスに登録するクラスがいくつかあります。特定の着信イベントで、ノーティファイアはupdate()各クラスの関数を呼び出します。これらの呼び出し先のうちの 2 つで、数秒待機してから外部ハードウェアを初期化して戻る小さなヘルパー スレッドを生成しようとしています。

ヘルパー スレッドはPTHREAD_CREATE_DETACHED属性を使用して作成されるため、結合を回避できます。

これは、(class1 から生成された) スレッドの 1 つでは問題なく動作しますが、(class2 から生成された) もう 1 つのスレッドではpthread_create()失敗しますEAGAIN。ドキュメントによるとpthread_create()、これはアプリケーションのリソースが不足している場合に発生します。ただし、別の受信イベントを提供すると、スレッド 1 は再びヘルパー スレッドを作成できますが、スレッド 2 は同じエラーで失敗し、同じ結果でこれを実行し続けることができます。

私が使用しているコードは、両方のクラスで同じです。

class class1_2 {
  public:
    void update();
  private:
    static void *init(void *self);
    pthread_t initThread;
    pthread_attr_t initThreadAttr;
}

void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  pthread_attr_setdetachstate(&initThreadAttr, PTHREAD_CREATE_DETACHED);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
}

void *class1_2::init(void *self)
{
  printf("Class%d init()\n", self->classNumber);
  //wait 3 seconds, then do stuff (~1 additional second)
  return;
}

gdb では、次の出力が得られます。

<incoming event>

Class1 update()
[New thread 1]
Class1 thread created=0

Class2 update()
Class2 thread created=11 (EAGAIN)

Class1 init()
[Thread 1 exited]

<incoming event>

Class1 update()
[New thread 2]
Class1 thread created=0

Class2 update()
Class2 thread created=11 (EAGAIN)

Class1 init()
[Thread 2 exited]

(...and so it goes on)

class1 のスレッド作成をコメントアウトしようとしましたが (これは機能します)、class2 はまだ失敗し、クラス間に微妙な違いがあると思いました。ただし、示されているコードは両方のクラスで同じであるため、他の変数/関数/などが影響を与える可能性があること、または他に何が起こっている可能性があるかについて誰かが手がかりを持っている場合は、それを聞いてとてもうれしいです.

4

2 に答える 2

1

担当者の目的のために、それが正しい場合に備えて、コメントを回答に昇格させます;)

pthread_attr_initを呼び出す前に、属性オブジェクトを初期化するために呼び出していることを確認pthread_attr_setdetachstateし、属性をもう一度破棄することも忘れないでください。

 void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  pthread_attr_init(&initThreadAttr);
  pthread_attr_setdetachstate(&initThreadAttr, PTHREAD_CREATE_DETACHED);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
  pthread_attr_destroy(&initThreadAttr);
}
于 2012-06-26T15:03:51.970 に答える
0

少しいじった後、私はそれを機能させました。切り離された状態でスレッドを作成する代わりに、作成後にスレッドを切り離していpthread_detach()ます。

したがって、 myupdate()は次のように変更されました。

void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
  retval = pthread_detach(initThread);
  printf("Class%d thread detached = %d\n", classNumber, retval);
}

誰かが同様のことを経験したことがある場合、またはこれに何らかの光を当てることができる場合、私はまだ興味があります.

于 2012-06-26T11:16:55.117 に答える