#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,
栈和栈指针,
程序计数器,
通用目的寄存器