线程

来源:互联网 发布:什么是淘宝旺旺号啊 编辑:程序博客网 时间:2024/06/07 21:27

一、概念:

线程:是进程内部的一个执行流,每个进程至少有一个线程,每个线程只能依赖一个进程,

线程通过线程库来创建,创建的线程被称为函数线程,main主函数呗称为主线程。

 

区分:

函数线程和函数调用的区别:

函数线程于主线程同时运行,分别在两条执行流中;而函数调用是顺序执行,与主函数在同一执行流中。

线程与进程的区别:

1、进程是资源分配的最小单位,线程是cpu调度的基本单位。

2、一个进程可以有多个线程,而一个线程只能依附于一个进程。

3、线程是轻量级的进程,不需要开辟大量内存。

4、进程是由双向的pcb链表进行管理的,而线程是由线程结构管理。

多线程之间共享资源:

全局变量、静态变量、堆区(在进程空间被开辟,所以为共享的)、文件等

独享资源:

线程id

线程的堆栈区(每一个函数线程都有自己的代码,有自己执行流,自己的堆栈区)

寄存器(由于线程之间是并发运行的,所以当一个线程切换到另一个线程中的时候要保存寄存器组的值,保护现场,便于之后继续运行,寄存器组里的数据也不尽相同)

 

线程的标识

线程idpthread_t  t;

获得当前线程的id


二、线程的使用

线程的创建:

int pthread_create(pthread_t *id, pthread_attr_t *attr, void*(*pthread_fun)(void*), void *arg); //创建一个函数线程                             成功返回0,失败返回错误码

第一个参数是线程id ; 第二个参数是定义线程属性,现在暂时定为NULL ; 第三个参数代表创建线程的入口地址;第四个参数代表指针参数,说此函数线程需要的参数,若参数大于1,则可定义结构体进行传参

线程的终止:

如果进程中的任何线程调用了_exit,exit,Exit退出的话,整个进程都会终止。在结束单个线程不终止整个进程的条件下使用int  pthread_exit(void *rval_ptr);函数结束线程

线程的等待:

int  pthread_join(pthread_t id, void  **rval_ptr);   //等待指定线程结束,并获得由rval_ptr

保存的退出码

注:学习多线程时,因为pthread的库不是Linux系统的库,所以在进行编译的时候要加上:-lpthread当主线程以exit结束时,进程结束,函数线程也会结束。


线程的传参方式,强转

传值:将值转为(void*)a,int b=(int)a;

传地址: (void*)&a,int b=*(int*)a先转为int型指针,再解引用


二、线程的管理

  通过线程控制块,线程控制表来管理线程,共享资源是不需要存在控制块里的。


四、线程的实现

用户级线程:

线程表存于用户态,内核态只有一个进程表,如图所示只维护一个进程


内核级线程:

线程表存于内核,内核态有一个进程表,线程表,如图所示维护三个线程


混合模式:原因:在用户态的时候进程的切换简单,效率高,在阻塞运行时采用内核态

代码示例:创建一个线程,主线程里对数组元素进行排序,函数线程里输出字符串的长度

#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<pthread.h>#include<semaphore.h>void * fun(){    printf("fun begin\n");    char *arr="hello world!";    int size=strlen(arr);    printf("%s length:%d\n",arr,size);    printf("fun end\n");} void main(){    printf("main begin\n");    pthread_t id;    pthread_create(&id,NULL,fun,NULL);//创建线程    int arr[]={1,6,34,2,9,5};    int length=sizeof(arr)/sizeof(arr[0]);    int i,j;    for(i=0;i<length-1;i++)    {       for(j=0;j<length-i-1;j++)       {           if(arr[j]>arr[j+1])           {               int tmp=arr[j];               arr[j]=arr[j+1];               arr[j+1]=tmp;           }       }   }   int k;   for(k=0;k<length;k++)   {       printf("%d ",arr[k]);   }   printf("\n");  sleep(2);  printf("main end\n");}

结果显示:



原创粉丝点击