我写了一些基本的多线程库。所以,对于每个线程,我都有一个上下文(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);
重新值为0.当我的SIZE_STACK为8192时,我得到一个seg错误。当它增加到16384时,这是一个正确的中止,如断言所预期的那样。
答案 0 :(得分:1)
assert的实现取决于平台。