ある種の基本的なマルチスレッド ライブラリを作成しました。したがって、スレッドごとにコンテキスト ( ucontext_t
) を作成します。私のテスト プログラムの 1 つで、失敗した assert を入れました。行番号で中止する代わりに、セグメンテーション違反をスローしました。次に確認したところ、コンテキストのスタック サイズが 8192 であることがわかりました。16394 に増やしたところ、アサートの失敗は期待どおりに機能しました。
assert が内部でどのように機能するか、またなぜそんなに多くのバイトを消費するのか教えていただけますか? 私のコンテキストでは、8192 はかなり大きいサイズだと思います。
これが私のスレッドの作成方法です
MyThread *temp;
temp=malloc(sizeof(MyThread_t));
ucontext_t tempContext;
if (getcontext(&tempContext) == -1)
temp->ThreadId = 0;
tempContext.uc_stack.ss_sp = (char *)malloc(SIZE_STACK*sizeof(char));;
tempContext.uc_stack.ss_size = SIZE_STACK*sizeof(char);
tempContext.uc_link = NULL;
makecontext(&tempContext,(void(*)(void))start_funct,1, args);
そして、私のテスト機能はこのようになっています。
T = MyThreadCreate(t0, (void *)n2);
re=MyThreadJoin(T);
printf("%d\n",re);
assert(re==-1);
re 値は 0 です。SIZE_STACK が 8192 の場合、セグ フォールトが発生します。16384 に増加すると、アサートから予想される適切なアボートです。