1.线程(light-weight process)轻量级进程,也有PCB;
2.从内核看进程和线程是一样的,都有各自不同的pcb,但是PCB中指向内存资源的三级页表是相同的。
3.进程可以蜕变成线程
4.线程可以看做寄存器和栈的集合。
5.linux下,线程是最小的执行单元;进程是最小的分配资源单位。
ps: 程序编译时要加 -lpthread
#include
#include
#include
#include
#include
#include
void* thrd_func(void* arg)
{
printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
//打印线程ID
return NULL;
}
int main()
{
pthread_t tid;
int ret;
pid_t pid;
printf("in main1: thread ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
/*1.tid传出参数
2.设置线程属性
3.执行函数,返回void*
4.函数的传入参数void*
*/
if(ret!=0)
{
printf("pthread_create error\n");
exit(1);
}
sleep(1);
printf("in main2: thread ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
return 0;
}
#include
#include
#include
#include
#include
#include
void* thrd_func(void* arg)
{
//int i=*((int*)arg);//对应传参如果是(void*)&i;
//不能用取地址的形式,因为线程是一起创建的,i值早变了
//i的值是不确定的,此时取的i值不是创建此线程的i值
//如果在循环中加sleep()可以用这种方式。
int i=(int)arg;
sleep(i);
printf("in func: %dth thread ID = %lu, pid=%u\n",i+1,pthread_self(),getpid());
//打印线程ID
return NULL;
}
int main()
{
pthread_t tid;
int ret,i;
pid_t pid;
printf("in main1: thread ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
for(i=0;i<5;i++)
{
ret=pthread_create(&tid,NULL,thrd_func,(void*)i);//创建新进程
/*1.tid传出参数
2.设置线程属性
3.执行函数,返回void*
4.函数的传入参数void*
*/
if(ret!=0)
{
printf("pthread_create error\n");
exit(1);
}
}
sleep(i);
printf("in main2: thread ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
return 0;
}
#include
#include
#include
#include
#include
#include
int val=200;
void* thrd_func(void* arg)
{
// printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
//打印线程ID
val=100;
printf("val changed!\n");
return NULL;
}
int main()
{
pthread_t tid;
int ret;
pid_t pid;
printf("main1: val= %d\n",val);
//printf("in main1: thread ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
/*1.tid传出参数
2.设置线程属性
3.执行函数,返回void*
4.函数的传入参数void*
*/
if(ret!=0)
{
printf("pthread_create error\n");
exit(1);
}
sleep(1);
printf("main2: val= %d\n",val);
//printf("in main2: thread ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
return 0;
}
#include
#include
#include
#include
#include
#include
void* thrd_func(void* arg)
{
sleep(1);
printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
//打印线程ID
return NULL;
}
int main()
{
pthread_t tid;
int ret;
pid_t pid;
ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
/*1.tid传出参数
2.设置线程属性
3.执行函数,返回void*
4.函数的传入参数void*
*/
if(ret!=0)
{
printf("pthread_create error\n");
exit(1);
}
printf("in main: thread ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
pthread_exit((void*)1); //只是主控线程退出,进程并没有结束,因此子线程可以继续打印输出
return 0;
}