最后这么实现了, 应该问题不大
#include "macro.h"
#include "list_head.h"
#include
#include
#include
#include
#define STACK_SIZE (8 * 1024 * 1024)
typedef struct {
list_head entry;
void* (*func) (void*);
void* arg;
} thread_t;
static thread_t* static_thread = NULL;
static thread_t* stack_alloc(int32_t size)
{
thread_t* thead = __sync_lock_test_and_set(&static_thread, NULL);
if (thead == NULL) {
thead = (thread_t *) malloc(sizeof(thread_t) + size);
}
return thead;
}
static int child(void* arg)
{
thread_t* thead = (thread_t *) arg;
thead->func(thead->arg);
thead = __sync_lock_test_and_set(&static_thread, thead);
if (thead != NULL) {
free(thead);
}
__asm__(
"movq $" str(__NR_exit) ", %rax\n"
"movq $0, %rdi\n"
"syscall\n"
);
return 0;
}
int mythread_create(void* (*func) (void*), void* arg)
{
thread_t* thead = stack_alloc(STACK_SIZE);
if (thead == NULL) {
return ENOMEM;
}
char* stack = (char *) (thead + 1) + STACK_SIZE;
thead->arg = arg;
thead->func = func;
pid_t pid = clone(child, stack, CLONE_FILES | CLONE_FS |
CLONE_VM | CLONE_IO | CLONE_SIGHAND | CLONE_THREAD, thead);
if (pid == -1) {
int n = errno;
free(thead);
return n;
}
return 0;
}
【 在 jackwish 的大作中提到: 】
: 如果用 libc ,munmap 在回收栈的时候栈不是正在用吗?不汇编不行啊……