int main (void) { pthread_t thread; int rv; pthread_attr_t attr; size_t stacksize, guardsize; char *stackaddr; pthread_attr_init(&attr); /* 起始化執行緒屬性物件*/ /* 申請用作執行緒堆疊的空間 */ stackaddr = (void *)thread_stack_alloc(PTHREAD_STACK_MIN); /* 設定執行緒屬性物件中的堆疊位址和大小 */ rv = pthread_attr_setstack(&attr, stackaddr, PTHREAD_STACK_MIN); check_error(rv, "pthread_setstack()"); /* 檢視堆疊屬性值 */ pthread_attr_getstack(&attr, (void *)&stackaddr, &stacksize); pthread_attr_getguardsize(&attr, &guardsize); printf("stack attributes: stackaddr=%d, stacksize=%d, guardsize=%d\n", stackaddr, stacksize, guardsize); /* 建立執行緒 */ rv = pthread_create(&thread, &attr, (void *(*)())Hello, (void *)NULL); check_error(rv, "pthread_create()"); pthread_attr_destroy(&attr); /* 及時銷毀執行緒屬性物件,避免再次使用 */ check_error(rv, "pthread_attr_destroy()"); /* ... 後繼程式程式碼 ... */ pthread_exit(NULL); }
static void __smp_boot_secondary(int cpu, secondary_entry_fn entry) { int ret; secondary_data.stack = thread_stack_alloc(); secondary_data.entry = entry; mmu_mark_disabled(cpu); ret = cpu_psci_cpu_boot(cpu); assert(ret == 0); while (!cpu_online(cpu)) wfe(); }