//线程
//1.轻量级进程,也有PCB 创建线程使用的底层函数和进程一样都是clone
//clone克隆父进程的0-3G的用户空间,父进程的PCB
//2.从内核看进程进程和线程一样的,都有各自不同的PCB,但是PCB中指向内存
//资源的三级页表时相同的
//创建进程,内存给进程分配4G的地址空间
//进程如何索引到4G地址空间? 虚拟地址到物理地址的映射关系
//Linux管理虚拟内存 采用三级页表形式管理(4K)
//3.进程可以变成线程
//线程和进程共用同一块页表
#include <pthread.h>
/*int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);*/
//第一个参数保存线程ID 传递一个pthread_t 变量的地址
//第二个参数 线程属性,用户空间的栈线程的优先级.默认NULL
//第三个参数函数指针,创建的线程去执行哪个函数
//最后一个参数启用函数的时候给他传递一个什么参数
//调用成功返回0,错误返回errno错误号
编译的时候 -lpthread 连接库
pthread_t pthread_self(void);//返回自己的线程ID
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void* th_fun(void* arg)
{
int* p=(int*)arg;
printf("thread ID =%x\n",(unsigned int)pthread_self());
printf("thread PID=%d\n",getpid());
printf("*arg=%d\n",*p);
sleep(1);
}
int main(){
pthread_t tid;
int n=10;
pthread_create(&tid,NULL,th_fun,(void*)&n);
printf("main thread ID=%x\n",(unsigned int)pthread_self());
printf("main child ID=%x\n",tid);
printf("man PID=%d\n",getpid());
return 0;
}
~