从内核角度看看pthread_create创建的线程共享进程哪些资源

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void* p1(void* args)
{
    printf("hello world\n");
    sleep(3);
}

int main()
{
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, p1, NULL);
    if (ret != 0)
    {
        return ret;
    }
    void* retval;
    ret = pthread_join(tid, &retval);
    if (ret)
    {
        return ret;
    }
    return 0;
}

命令

gcc 1.cpp -lpthread -o 1out
strace ./1out

结果

ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, 
rlim_max=RLIM_INFINITY}) = 0
uname({sysname="Linux", nodename="user-NF8480M5", ...}) = 0
mmap2(NULL, 8392704, PROT_READ|PROT_WRITE,  
MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xf755f000  
//  MAP_PRIVATE:内存段是线程私有的,对内存的修改不会反映到被映射的文件中
//  MAP_ANONYMOUS:这段内存不是从文件映射得到的
brk(NULL)                               = 0x9381000
brk(0x93a2000)                          = 0x93a2000
mprotect(0xf755f000, 4096, PROT_NONE)   = 0
clone(child_stack=0xf7d5f424, flags=CLONE_VM|CLONE_FS|CLONE_FILES|
CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|
CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,

// CLONE_VM: 共享内存描述符和页表
// CLONE_FS: 共享根目录和当前工作目录所在的表
// CLONE_FILES: 共享打开文件表
// CLONE_SIGHAND:共享信号处理程序的表,阻塞信号表和挂起信号表
// CLONE_THREAD: 插入到父进程的统一线程组里,并迫使子进程共享父进程的信号
// 描述符,也设置子进程的tgid和group_leader,如果这个标志位为TRUE,必须设置
/ CLONE_SIGHAND标志
// 共享信号量
// CLONE_SETTLS:为线程创建TLS
// CLONE_PARENT_SETTID: 把线程TID写入ctid参数所指向的用户态变量中

parent_tidptr=0xf7d5fba8, 
tls={entry_number:12, 
base_addr:0xf7d5fb40, limit:1048575, seg_32bit:1, 
contents:0, read_exec_only:0, limit_in_pages:1, 
seg_not_present:0, useable:1}, child_tidptr=0xf7d5fba8) = 108791
futex(0xf7d5fba8, FUTEX_WAIT, 108791, NULLhello world
) = 0

问题二: 线程有哪些自己的资源???

TID,
栈和栈指针,
程序计数器,
通用目的寄存器

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值