基本概念
线程,又称为轻量级线程,是程序执行流的最小单元!进程是分为用户级线程和内核级线程!
常见的模型有
线程:进程
1 :1 指的是 kernel-level thread ,on Linux usual c library implement this approach!
N: 1 指的是 用户级线程! An N:1 model implies that all application-level threads map to a single kernel-level scheduled entity; the kernel has no knowledge of the application threads. With this approach, context switching can be done very quickly and, in addition, it can be implemented even on simple kernels which do not support threading
对于用户级线程,其好处是能够快速的进行context switch 转换,因为它们之间是没有进入到内核模式下的!缺点就是,不能够利用硬件来加速!因为每次只能有一个thread
能够被processor调用!
2)特点
线程,是对进程进一步的细分,它的引入是为了更好并发执行程序,提高执行效率。线程之间共享进程资源,一个线程是可以创建或者是撤销一个线程。
在线程 中 context switch 速度 比在进程间的速度要快很多。线程包含必需的系统资源,比如pc,一些必须的寄存器和堆栈,线程id等!
3)与进程的区别
1)进程含有独立的地址空间,而线程是没有的,线程必须在进程中才有!线程是必须依靠线程才能够生存 。一个进程可以看作是一个独立的线程
2)线程中含有少量的自己必需的状态信息,而进程中则包含大量的信息!
3)在进程中进行context switch 比在线程中context switch 慢很多!
4) 线程的创建以及终止
首先介绍几个比较重要的函数
这些函数的头文件都是#include<pthread.h>
int pthread_equal(pthread_t tid1,pthread_t tid2)//比较两个线程id是否相等
pthread_t pthread_self(void)//返回的是自己的线程id
int pthread(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);//创建一个id
给出一段代码做参考!
#include<pthread.h>
#include<stdio.h>
void * func(void *arg)
{
printf("the pid of the programming is %d\n",getpid());
printf("the new thread is :%u\n",pthread_self());
return ((void*) 0);
}
int main()
{
pthread_t tid=pthread_self();//tid 是main这个线程的id
pthread_t ntid;
printf("the main thread is %u:\n",tid);
pid_t pid=getpid();
printf("the pid of the process is %d:\n",pid);
int err=pthread_create(&ntid,NULL,func,NULL);
if(err!=0)
printf("create thread error\n");
sleep(1);
return 0;
}
从这个程序中我么可以看到新建的线程和以前的线程是在同一个进程中的,但是它们的线程id是不同的!
线程的终止:
1)不能够使用一些比较常用的函数 ,比如说_exit,exit 等函数,在任何一个线程中使用这些函数,将使得进程给终止。
2)有三种方式来终止一个线程
1.线程被其他的线程给取消
2.线程调用pthread_exit() 函数
3.线程从启动例程中返回,返回的是线程的退出码!
我们通常用pthread_join()函数来取出线程的退出码
给出个简单利用的例子
#include<pthread.h>
#include<stdio.h>
void * func(void *arg)
{
printf("the thread1 exit \n");
pthread_exit((void *)1);
}
void * func1(void *arg)
{
printf("the thread2 exit \n");
pthread_exit((void *)2);
}
int main()
{
int err;
pthread_t tid1,tid2;
void *tret;
err=pthread_create(&tid1,NULL,func,NULL);
if(err!=0)
printf("can't create thread 1:\n");
err=pthread_create(&tid2,NULL,func1,NULL);
if(err!=0)
printf("can't create thread 2:\n");
err=pthread_join(tid1,&tret);
if(err!=0)
printf("can't join thread1\n");
printf("thread1 exit code %d\n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0)
printf("can't join thread2\n");
printf("thread2 exit code %d\n",(int)tret);
return 0;
}