我写了一些基本的多线程库。因此,对于每个线程,我都需要一个上下文(ucontext_t)。在我的一个测试程序中,我放入了一个失败的断言。而不是中止行号,而是引发了分段错误。然后,我检查了一下,发现我的上下文的堆栈大小为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时,这是断言所期望的适当中止。

最佳答案

assert的实现取决于平台。

关于c - 断言段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19020748/

10-13 04:47