5

APIpthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
は、作成されたスレッド スタックに割り当てられる最小スタック サイズ (バイト単位) を設定します。

しかし、最大スタックサイズを設定するにはどうすればよいでしょうか?

ありがとう

4

3 に答える 3

9

スタックのメモリ割り当てを自分で管理する場合はpthread_attr_setstack、スタック サイズを正確に設定できます。その場合、最小値は最大値と同じです。たとえば、次のコードは、プログラムがスタックに割り当てられているよりも多くのメモリにアクセスしようとした結果、プログラムがセグメンテーション違反を起こした場合を示しています。

#include <pthread.h>

#define PAGE_SIZE 4096
#define STK_SIZE (10 * PAGE_SIZE)

void *stack;
pthread_t thread;
pthread_attr_t attr;

void *dowork(void *arg)
{
 int data[2*STK_SIZE];
 int i = 0;
 for(i = 0; i < 2*STK_SIZE; i++) {
   data[i] = i;
 }
}

int main(int argc, char **argv)
{
  //pthread_attr_t *attr_ptr = &attr;
  posix_memalign(&stack,PAGE_SIZE,STK_SIZE);
  pthread_attr_init(&attr);
  pthread_attr_setstack(&attr,&stack,STK_SIZE);
  pthread_create(&thread,&attr,dowork,NULL);
  pthread_exit(0);
}

自動的に割り当てられるメモリに依存している場合は、最小量を指定できますが、最大量は指定できません。ただし、スレッドのスタック使用量が指定した量を超えると、プログラムでセグメンテーション違反が発生する可能性があります。

のマニュアルページにpthread_attr_setstacksizeは次のように記載されていることに注意してください。

A thread's stack size is fixed at the time of thread creation. Only the main thread can dynamically grow its stack.

このプログラムの例を見るには、このリンクを見てみてください

それらが提供するコード セグメントを試してみると、十分なスタック スペースを割り当てないと、プログラムにセグメンテーション違反が発生する可能性があることがわかります。

于 2013-03-15T21:19:40.420 に答える
1

通常、スレッドごとのデフォルトのスタック サイズは、pthreads() のほとんどの実装で非常に大きくなります。ただし、デフォルトよりも大きい値が必要な問題が発生した場合は、pthread_attr_stacksize() を使用して値を大きくし、同じように戻り値を確認して、より大きな値を見つけようとすることができます。実際の制限は、おそらく、特定のシステムのプロセスごとのアドレス空間制限に基づいています。

デフォルトのスタックサイズを知りたいだけなら、pthread_attr_getstacksize() を使用できます。スレッドを作成する前に自分で調整して指示しない限り、それ以上大きくなることはありません。

pthreads でスタック サイズを調整するためのいくつかのコードがここに示されてい ます https://stackoverflow.com/a/15356607/2159730

注: リンクの例は、スタック使用量を最小限に抑え、最小値を見つけるためのものです (これは多くのテストを行わないと危険です)。あなたがやりたいと思っていることとは正反対ですが、例はまだあなたに役立つかもしれません. 別の方法でアプローチするだけです。

一般に、pthread スタック サイズをデフォルトより大きくする必要はおそらくないはずです。もしそうなら、なぜそれが起こっているのかを理解しようとするべきでしょう。それはかなり珍しいことです。

一般的な質問ではなく、自分のコードで実際に何が起こっているのかを説明できれば、他の解決策が見つかるかもしれません。あなたが実際にスレッドごとのスタックサイズを減らそうとしているのか、そして自分自身を明確に説明していないのか疑問に思っています。その場合、リンクはその理由でも役立つかもしれません。

于 2013-03-15T21:37:59.263 に答える
0

そうする選択肢はないと思います。

を参照する場合は<pthread.h>、定数定数を探しますPTHREAD_STACK_MIN。これは、新しく作成されたすべてのスレッドの既定のスタック サイズです。

の動作は次のpthread_attr_setstacksize場所にあります

The pthread_attr_setstacksize() function will fail if:
[EINVAL]
    The value of stacksize is less than PTHREAD_STACK_MIN 
    or exceeds a system-imposed limit.

したがって、質問に正確に答えるために、POSIX ライブラリを使用してスレッドの最大スタック サイズを設定することはできません。

于 2013-03-15T14:52:26.207 に答える