多くのスレッドを作成および破棄していますか?
ほとんどの pthread 実装は、スレッド スタックを割り当てるときに「ガード ページ」を追加します。これは、スタック オーバーフローを検出するために使用される、アクセス保護されたメモリ ページです。ガード ページを保護 (保護解除) するために、スレッドが作成または終了されるたびに、少なくとも 1 回は mprotect を呼び出す必要があります。この場合、いくつかの明らかな戦略があります。
pthread_attr_setguardsize()
スレッドを作成する前に、ガード ページ サイズをゼロに設定します。
- スレッドプールを使用します(プロセッサが言うほど多くのスレッドの)。スレッドがタスクを処理したら、スレッドを終了して新しいスレッドを作成するのではなく、プールに戻して新しいタスクを取得します。
別の説明としては、オーバーフローが検出された場合にスレッドのスタックが拡張されるプラットフォームを使用している可能性があります。これは GCC/Glibc を使用する Linux ではまだ実装されていないと思いますが、最近、これらの方針に沿った提案がいくつかありました。処理中に大量のスタック スペースを使用する場合は、 を使用して初期/最小スタック サイズを明示的に増やすことができますpthread_attr_setstacksize
。
または、それはまったく別のものかもしれません!