我正在尝试试验如何为Linux 3.10.0-327.3.1.el7.x86_64中的线程实现clone()
我正在运行这段代码并且偶尔会出现段错误。我知道如果我使用CLONE_THREAD
那么就没有办法检查线程是否完成,但为什么printf
会导致问题? Pthread
库如何处理此问题?没有printf
s就没有段错误。
#define STACK_SIZE (1ULL<<22) //4MB
int tmp = 10;
int threadfunc(void *ptr)
{
printf("i'm here\n");
tmp++;
return 0;
}
int main()
{
char *child_stack = malloc(STACK_SIZE);
int child_pid = clone(&threadfunc, child_stack+(STACK_SIZE)-1, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM|CLONE_FS|CLONE_FILES|SIGCHLD, NULL);
printf("my pid: %d\n", getpid());
printf("child pid: %d\n", child_pid);
printf("tmp is: %d\n", val);
return 0;
}
答案 0 :(得分:3)
printf
函数无法理解它是在clone
中调用的
任务;它是围绕glibc pthread库设计的。
您正在做的事情类似于使用异步信号中断printf
,并从信号中重新输入printf
。
库如何处理问题是它使用clone
作为更复杂的线程实现的一部分,它用线程标识“装扮”克隆的任务。此线程标识允许printf
锁定流操作周围的互斥锁。
什么是线程标识?这意味着C库中与线程相关的函数可以用某种方式查询“什么线程正在调用我?”获取一个映射到线程描述符结构的ID。仅clone
函数不会设置此标识。