プログラムの通知クラスに登録するクラスがいくつかあります。特定の着信イベントで、ノーティファイアは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 はまだ失敗し、クラス間に微妙な違いがあると思いました。ただし、示されているコードは両方のクラスで同じであるため、他の変数/関数/などが影響を与える可能性があること、または他に何が起こっている可能性があるかについて誰かが手がかりを持っている場合は、それを聞いてとてもうれしいです.