【问题标题】:How does linux kernel reset the 'used' flag in the 'tid' field in "struct pthread" of GLIBC?linux内核如何重置GLIBC的“struct pthread”中“tid”字段中的“used”标志?
【发布时间】:2019-02-24 10:38:19
【问题描述】:

查看 glibc 代码时,观察到一行描述“请注意,我们不会重置 'tid' 字段中的 'used' 标志。这是由内核完成的”在 glibc_source(版本 2.21)中(@987654321 @) 在第 760 行。

据我了解,glibc 重用了缓存堆栈列表中维护的 T2 线程堆栈。但在重用该堆栈之前,它会检查 T1 的线程描述符中的 tid 字段(在 T1 的 pthread_join 之后已重置为 -1)。

T1 - First thread.
T2 - Second thread created after T1 exited.

根据文件 (allocatestack.c:760) 中的注释, struct pthread 的 'tid' 字段由 linux 内核重置。但是,据我了解,tid 字段由 pthread_join 重置。

内核如何重置'tid'字段?如果我的理解有误,请指正。

【问题讨论】:

    标签: linux linux-kernel glibc


    【解决方案1】:

    这里的意思是tid成员也被用作一个标志来指示堆栈是否在使用中。它不引用成员内部的位。

    当线程退出时内核将tid 成员设置为零,因为clone 系统调用是使用CLONE_CHILD_CLEARTID 标志调用的,并且tid 成员的地址被传递给它。详情请见sysdeps/unix/sysv/linux/createthread.c

    【讨论】:

    • 我明白了。 mm_release() 函数正在清除 tid 成员。非常感谢。
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2015-05-19
    相关资源
    最近更新 更多