我想弄清楚什么样的轻量级流,结果,我脑子里的一团糟变得更浓了……我在这里读了 W. Richard Stevens 和 Steven A. Rago 的书“UNIX. Professional Programming”,那里是一块:
pthread_t ntid;
void
printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid,
(unsigned int)tid, (unsigned int)tid);
}
void* thr_fn(void *arg)
{
printids("новый поток: ");
return((void *)0);
}
int
main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if (err != 0)
err_quit("невозможно создать поток: %s\n", strerror(err));
printids("главный поток:");
sleep(1);
exit(0);
}
这linux
导致了以下结果:
$ ./a.out
новый поток: pid 6628 tid 1026 (0x402)
главный поток: pid 6626 tid 1024 (0x400)
那些。对于每个线程都是process id
不同的,因为当使用该类型pthread_create
的系统调用clone()
时,这也是一种过程...... 线程有共同的地址空间,但有自己的栈,进程有不同的地址空间。
谷歌搜索非常令人困惑:它在某个地方说posix threads
在 Linux 中它们只在内核空间中工作,在用户空间中的某个地方,在两者中的某个地方。我认为在 there 和 there 中都只执行进程。
因此问题:
linux 中的本机线程是在用户空间还是内核空间中运行?
Linux 中是否有本机线程?它是轻量级进程吗?
是的,由于调用而产生了本机线程
clone()
,并且它们(在pthread的实现中)在用户空间中运行,是轻量级进程(至少在某种意义上它们是由与其他进程相同的内核调度程序分配的 CPU 时间片).每个这样的线程都有自己的堆栈(在共享地址空间中)、信号掩码、变量
errno
(可能还有一些资源,请参阅pthreads(7) - Linux 手册页了解详细信息)。我怀疑您正在处理遗留的 LinuxThreads 或试图模仿它们的行为以实现向后兼容性。在内核版本 2.6 中,Linux 不得不切换到 NPTL(Native POSIX Thread Library),根据 POSIX 要求,它必须
getpid()
从一个进程的所有线程返回相同的值。http://www.drdobbs.com/open-source/nptl-the-new-implementation-of-threads-f/184406204
请参阅“迁移到 NPTL”