linux内核在glibc/sysdeps/unix/sysv/linux/x86_64/clone.S上克隆abi定义:
The kernel expects:
rax: system call number
rdi: flags
rsi: child_stack
rdx: TID field in parent
r10: TID field in child
r8: thread pointer
以及go1.11.5/src/运行时/sys_linux_amd64.s上的golang克隆syscall:
// int32 clone(int32 flags, void *stk, M *m
在浏览glibc代码时,观察到一行描述“注意,我们没有重置'tid‘字段中的'used’标志,这是由内核在第760行的glibc_source (Version2.21) ()中完成的。”
根据我的理解,glibc重用缓存堆栈列表中维护的T2线程堆栈。但是在重用该堆栈之前,它会检查T1的线程描述符中的tid字段(在pthread_join of T1之后已经将其重置为-1 )。
T1 - First thread.
T2 - Second thread created after T1 exited.
根据在文件中的注释(allocatestack.c:760),结构线程的
while(variable > 0){
updatevariable(); //variable gets updated from UDP serevr.
// i want to execute a shell command here without blocking current execution.
} 我尝试使用system()函数,但它阻塞了当前的执行,如果条件不满足,我应该能够停止shell命令,而不应该等到shell命令完成执行。(我使用的外壳命令是rtl_fm,它不会停止执行,直到我们手动停止它)。我专门为linux OS编写了这段代码。我确切地知道,
我对所有这些细节以及它们如何在Linux中相互关联感到有点困惑。"Unix内部“一书指出,lightweight process (LWP)是内核支持的用户线程,内核看不到进程内部的线程。对于Linux,这仍然是正确的吗?
据我所知,用户空间线程被安排在进程内部,通过更高层次的抽象作为pthread库,而不需要内核的干预。我说的对吗?