1

マルチスレッド プログラムで問題が発生しました。私のプログラムには、常にここにある 4 つのスレッドがあります。これらのスレッドに 1 から 4 までの名前を付けます。

私のプログラムの目標は、ソケットで周辺機器と通信することです。スレッド番号 4 は、ペリフェラルにメッセージを送信するために使用されます。

メッセージが周辺機器に送信されるたびに、次を使用します。

pthread_create(&m_hThreadMsgReader, NULL, &ThreadMsgReader, (void*) &argStruct);

これにより、ソケットで応答をリッスンするスレッドが作成されます。このスレッドは、ソケットにメッセージが含まれていない場合に戻ります。つまり、iRet = recv(m_iSocket, pcRecBuf, DEFAULT_READ_DATA_LEN, 0);iRet が値 0 を取る場合。

そのため、現在の実装では、(ユーザー入力を介して送信される他のコマンドは別として) ペリフェラルでデータ プーリングが (毎分) 行われます。

ここでの問題は、数時間後に pthread create がエラー 11 でクラッシュすることです。システムに十分なリソースがないか、スレッドが多すぎることを意味するスタック オーバーフローを見てきました。

しかし、QtCreator デバッグのように理解できません。1 から 4 までのスレッドしか表示できません。300 スレッドほど作成した可能性があることはわかっていますが、スレッドのリストには 4 しか含まれていません。これは、他のすべてのスレッドが終了したことを意味します。

したがって、スレッド作成の最大数がプロセスの全存続期間中なのか、同時に存在するスレッド数なのかはよくわかりません。

空のソケットでリッスンする場合でも、リッスン用に単一のスレッドを持つ方法を見つける必要がありますか? 私の実装は悪いパターンですか?

4

1 に答える 1

2

pthread_join取得したリソースを解放するために呼び出す必要があります。またはPTHREAD_CREATE_DETACHED、その場合は属性を使用できます。使用する必要はありませんpthread_join

于 2013-05-16T07:20:55.897 に答える