- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <pthread.h>
#include <iostream>
int main(){
std::cout<<pthread_self()<<std::endl;
}
当使用命令g++ 1.cpp -o 1
编译并执行时,程序输出为0
,如果使用命令g++ 1.cpp编译-o 1 -lpthread
输出是一个很大的数字,如 140062699310912。
我不明白为什么。
# g++ 1.cpp -o 1 && ./1
0
# g++ 1.cpp -o 1 -lpthread && ./1
140268785461056
最佳答案
POSIX 标准没有指定 pthread_t
的实际类型对应。在 glibc 中,它是 unsigned long int
,这就是 C++ 流可以打印其值的原因。 (这不是可移植的。)
为什么 pthread_self
返回零,但仅当不与-lpthread
链接时?
从历史上看,glibc 支持两种不同的线程库实现,LinuxThreads 和 NPTL。一些核心libpthread
函数在 glibc 本身中有 stub ,如果加载了任何 stub ,它们会转发到实际实现,或者如果进程中不存在线程库,则执行一些虚拟回退操作。例如,pthread_mutex_lock
的虚拟实现和 pthread_mutex_unlock
什么都不做。
在pthread_self
的情况下,虚拟实现必须返回一些值,并且这个值为零。 (POSIX 不保留任何 pthread_t
值来指示失败或其他极端情况,所以这很好。)当与 -lpthread
链接时,使用非虚拟实现,它返回一个指向内部线程数据结构的指针(转换为 unsigned long
),并且这个值永远不会为零,即使对于初始(主)线程也是如此。这就是为什么 -lpthread
存在的原因在链接器命令行上很重要。
其他人无法重现此行为,因为他们要么使用非 glibc 系统,要么使用更新版本的 glibc。现在,glibc 只有一个线程库实现,最初是 NPTL,它与 glibc 的其余部分紧密集成。这意味着不再需要转发器,在 glibc 2.27 中, pthread_self
never returns zero .顺便说一句,此更改有助于实现 std::thread
,其中 get_id()
返回的值为零: std::thread::id{}
意味着没有 ID,而不是该线程是主线程(如在未加载 libpthread
的旧 glibc 版本中)。 libstdc++
因此需要一个 kludge 来支持 glibc 2.26 及更早版本。
转发器还有另一个好处:它们可以实现性能优化,而不仅仅是为了 pthread_mutex_lock
(如果未链接 libpthread
,则不执行任何操作)。一些libpthread
没有 -lpthread
的功能可用.这意味着应用程序可以使用同步并且它们可以检查是否存在符号,例如pthread_create
。或 pthread_cancel
(使用弱符号引用)。如果这些weak symbols是undefined,很明显这个进程一定是单线程的,如libpthread
不存在,这意味着不能创建线程。在这种情况下,例如,没有必要使用原子指令来进行引用计数。 (std::shared_ptr
in libstdc++
使用了这样的优化。)但是这种优化越来越无效,因为大多数过程镜像包含 libpthread
这些天:一些库需要它,所以它作为间接依赖加载。这意味着转发器也失去了这个其他目的,并且它们正逐渐从 glibc 中删除。 (glibc 2.32 添加了 __libc_single_threaded
以启用单线程优化,即使加载了 libpthread
,但还没有创建线程。)
关于linux - pthread_self 返回一个大整数或 0,这取决于 libpthread 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63841881/
我正在使用/usr/include/nptl/pthread.h 中的 pthread_setaffinity_np 等函数。 但是链接器提示找不到“pthread_setaffinity_np”,据
在编译一个简单的多线程程序时,我似乎无法链接 pthread 的共享对象。我收到以下错误: /data/hunyadi/usr/bin/../lib/gcc/x86_64-pc-linux-gnu/7
我需要一个非剥离版本的 libpthread.so 来进行调试。我怎样才能从源代码编译它?主机是 Linux 2.6。 最佳答案 如果您使用的是基于 RPM 的系统,请使用 rpm -qf .../l
我正在运行 RHEL 5.1 并使用 gcc。 如何告诉 cmake 将 -pthread 添加到编译和链接? 最佳答案 @Manuel 已经到了那里。您也可以添加编译器选项,如下所示: 如果您有 C
我有一个 libpthread 链接的应用程序。该应用程序的核心是由四个线程共享的两个 FIFO(两个线程每个一个 FIFO,即;)。 FIFO 类使用 pthread 互斥锁进行同步,它存储指向大类
我已经从这个网站下载了源代码 http://mnbayazit.com/406/bayazit 该项目有一些依赖项: 库:FTGL(用于字体)、FreeType2(FTGL 需要)、GLFW(用于窗口
我正在尝试使用 mingw 编译以下程序: #include #include #include #include #include void *hello(void *id) { in
所以基本上我想知道为什么我的可执行文件将 libpthread 作为共享库,而我的代码却没有使用任何线程函数。它也不包含在 makefile 中。是不是因为 GCC 默认编译时加上了 "--enabl
我正在使用 Mingw64 for Windows(当然),我通常静态链接到 libwinpthread.a。但我注意到还有一个名为 libpthread.a 的库(没有 win)。我可以看到它们有不
我目前正在尝试使用 CUDA 例程创建一个库,但我遇到了麻烦。我将使用一个相当简单的示例来解释我的问题,我的实际库会更大。 我已经写成功了test.cu ,包含 __global__ 的源文件CUDA
我正在使用 android-NDK-r10 编译包含 libspotify 函数的 C++ 代码。 在我的应用程序中,我在扩展 Service 的类的 onCreate() 方法中包含两个库,如下所示
我遇到了这个问题,我希望能在这里找到一些帮助来解决这个问题。我创建了一个小型示例可执行文件和共享库来展示该问题。 抱歉,我意识到这已经变成了一堵文字墙,但我试图确保包含所有相关信息。 我的设置 Sys
我这里有这段代码: 这些是用于创建和停止 pthread 的函数: void WatchdogController::conscious_process_handler_start() { i
有没有办法确定在系统上找到的给定 libpthread 和 libthread_db 是否匹配? 我知道的唯一方法是尝试在使用 libpthread 库构建的程序上启动 gdb。还有其他的吗? 最佳答
我一直在 Node 中编写一个守护进程(由 forever 托管)并注意到工作进程有时会随机死亡。我添加了 segault handler看看发生了什么,但典型的堆栈跟踪是......没有帮助? PI
#include #include int main(){ std::cout<
我有一个配置了 --host=i686-pc-linux-gnu --target=powerpc-e300c3-linux-gnu 的 cross-gdb。我可以使用 gdbserver 在远程板上
我在 odbc sdk 中编译一些示例时遇到问题。在与库顺序混合了一段时间后,我以某种方式设法获得了其中少数 undefined reference 的数量。 可悲的是,我不知道如何摆脱其余的。这是失
我正在从事一个项目,该项目需要将基于 Rust 的插件(共享对象)任意加载/卸载到隔离的动态库命名空间中。 我使用 dlmopen(LM_ID_NEWLM, "rust-plugin.so", RTL
当我编译openvswitch-1.5.0时,遇到以下编译错误: gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
我是一名优秀的程序员,十分优秀!