我遇到了“ 高级Linux编程”中的
一个概念。这里是一个链接:请参阅
4.5 GNU / Linux线程实现 。
我对作者所说的概念很清楚,但是我对他解释的为线程打印processID的程序感到困惑。
这是代码
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
根据作者,上述代码的输出为
% cc thread-pid.c -o thread-pid -lpthread
% ./thread-pid &
[1] 14608
main thread pid is 14608
child thread pid is 14610
我编译时得到的输出是
[1] 3106
main thread pid is 3106
child thread pid is 3106
我知道,创建线程时,Linux内部调用 clone (大多数情况下),就像 fork
系统调用创建进程一样。唯一的区别是在进程中创建的线程共享相同的进程地址空间,而由父进程创建的进程将复制父进程地址空间。因此,我认为在线程中打印进程ID会导致相同的processID。但是,它在书中的结果并不相同。
请告诉我他在说什么..?本书/我的答案是否正确?
我在包含libc libuClibc-0.9.30.1.so
(1)的 linux上获得了与本书相同的结果。
root@OpenWrt:~# ./test
main thread pid is 1151
child thread pid is 1153
我试图用包含来自ubuntu的libc的linux运行该程序libc6
(2)
$ ./test
main thread pid is 2609
child thread pid is 2609
libc (1) 使用linuxthreads
pthread的实现
和libc (2) 使用NPTL
(“本地posix线程库”)执行pthread
根据linuxthreads
FAQ
(在J.3中回答):
每个线程实际上都是具有不同PID的不同进程,并且发送到线程PID的信号只能由该线程处理
因此,在使用linuxthreads
实现的旧libc中,每个线程都有其不同的PID
在使用NPTL
实现的新libc版本中,所有线程都具有与主进程相同的PID。
该NPTL
是由红帽团队开发。并且根据redhat
NPTL文档:在NPTL
实现中解决的问题之一是:
(第5章:现有实施中的问题)
每个具有不同进程ID的线程都会导致与其他POSIX线程实现的兼容性问题。这部分是有争议的,因为信号不能很好地使用,但仍然很明显
这可以解释您的问题。
您正在使用新的libc版本,其中包含NPTL
pthread 的(“ Native posix线程库”)实现
本书使用的旧版libc包含linuxthreads
pthread的实现
问题内容: 我不太清楚该在哪里抛出该异常。 例如,我正在实现接口,并且不希望任何人调用该方法: Future#get(long,TimeUnit)。 所以,我可以扔吗? 事情是方法的规范并没有说明抛出异常。反过来,例外 抛出以指示不支持请求的操作。 类UnsupportedOperationException 我的意思是,如果您不希望调用它,通常会抛出它,否则可能会因为不是所有方法都已实现而被认为
问题内容: 我试图了解Go中的并发性。特别是,我编写了以下线程不安全程序: 我认识到我应该使用渠道来防止与发生竞争,但这不是重点。程序打印,然后似乎永远循环(不再打印任何内容)。我希望它能打印出无限的数字列表,可能由于竞态条件而跳过某些数字并重复其他数字(或更糟的是,在更新数字时打印数字)。 我的问题是:为什么程序只打印一行? 只是要清楚一点:对于这个玩具示例,我不是故意使用渠道。 问题答案: 关
问题内容: 我了解这是一个框架;甚至还有一个开源的跨平台游戏开发库。我转到libgdx主页,并按照视频教程中的说明进行操作。正确设置项目后,我可以在多个受支持的平台上运行默认的my- gdx-game项目。太好了,花花公子…现在呢? 我一直在搜索论坛,Wiki,javadocs和许多其他站点,以寻找体面的简单操作方法。不幸的是,我找不到任何东西,那里的大多数帮助都假设您对这个库有一些基本的了解。
问题内容: JNDI就像是类固醇的地图,对吗?我使用键来查找对对象的引用。另外,什么是InitialContext?我似乎不知道这个主意。 问题答案: 从概念上讲,JNDI就像类固醇。 允许您从命令行将参数传递给代码。同样,JNDI允许您在代码外部(例如,在应用程序服务器配置文件中)配置任意对象,然后在代码中使用它们。 换句话说,它是Service Locator模式 的实现:您的代码从中心注册表
问题内容: 我正在尝试使用触发两个请求,然后在两个请求完成后调用一些函数。这是我的代码: 但是,这没有按预期方式工作。Ajax调用将返回要在其中使用的数据,而Ajax调用将返回要分配给var count并随后在中使用的count 。 但是,当我启动上面的代码时,先被调用,然后再将数据保留为as 。我如何才能做到这一点,据我所知,只有当两个返回的函数都执行时,才能进行。我希望两个ajax调用都应该并
问题内容: 我终于升级了python版本,并发现了新功能。除其他外,我正在为新方法scratch之以鼻。从文档: 只要包含类被子类化,就会调用此方法。那么cls是新的子类。如果定义为普通实例方法,则此方法将隐式转换为类方法。 因此,按照文档中的示例,我开始进行一些操作: 产生以下输出: 我知道在子类定义 之后 会调用此方法,但是我的问题特别是关于此功能的用法。我也阅读了PEP 487 文章,但并没