我不能说我建议用克隆去,如果你可以使用并行线程。我对函数有不好的经验,例如malloc()与克隆有关。
有你看了man page的文档?
这里是我运行一个实例。我没有真正检查你的代码,看看它为什么会崩溃。
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#include
// Allow us to round to page size
#define ROUND_UP_TO_MULTIPLE(a,b) \
(((a) % (b) == 0) ? (a) : ((a) + ((b) - ((a) % (b)))))
struct argsy {
int threadnum;
};
int fun(void * args) {
struct argsy * arguments = (struct argsy *) args;
fprintf(stderr, "hey!, i'm thread %d\n", arguments->threadnum);
return 0;
}
#define N_THREADS 10
#define PAGESIZE 4096
struct argsy arguments[N_THREADS];
int main() {
assert(PAGESIZE==getpagesize());
const int thread_stack_size = 256*PAGESIZE;
void * base = malloc((((N_THREADS*thread_stack_size+PAGESIZE)/PAGESIZE)*PAGESIZE));
assert(base);
void * stack = (void *)ROUND_UP_TO_MULTIPLE((size_t)(base), PAGESIZE);
int i = 0;
for (i = 0; i < N_THREADS; i++) {
void * args = &arguments[i];
arguments[i].threadnum = i;
clone(&fun, stack+((i+1)*thread_stack_size),
CLONE_FILES | CLONE_VM,
args);
}
sleep(1);
// Wait not implemented
return 0;
}