线程

来源:互联网 发布:touch bar 知乎 编辑:程序博客网 时间:2024/05/23 00:03

线程

  1. 线程
    线程是程序中的一条执行序列(执行单元),一个进程至少有一个线程(主线程),一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
  2. 线程与进程的异同点
    1)线程与进程都可以并发执行;
    2)线程是进程调度的最小执行单位;进程时资源分配的最小单位;
    3)在切换时,线程比进程消耗少,效率高;
  3. 线程的创建以及退出函数(phread.h)
    (创建函数)int pthread_create(pthread_t id,pthread_attr_t *attr,void(pthread_fun)(void*),void*arg);
    进程id一般由系统自动分配;attr为进程属性;pthread_fun为函数线程;arg为函数线程的参数(可以传值也可以传地址)1>传值时,强转为(void*),对arg再强转为其相应的变量类型;2>传地址时,对地址强转为(void*),对arg在强转为变量类型的指针,在取值;若传的是地址,获取变量值时要注意,变量值是否被改变;
    (退出函数)void pthread_exit(void * reval);
    (等待线程结束的函数)int pthread_join(pthread_t id,void**p);阻塞等待指定进程的退出以及获取指定进程由pthread_exit的退出信息;

  4. 举例
    创建两个线程:线程1打印100以内所有素数;线程2对数组进行选择排序,对主线程进行睡眠等待或者pthread_join等待线程1、2结束;

int ar[]={22,55,99,11,66,33,88,44,77};void *pthread_fun2(void *arg){    printf("函数线程2开始运行:对数组进行选择排序并打印::\n");    int i=0;    int n=sizeof(ar)/sizeof(ar[0]);    for(;i<n-1;++i)    {        int k=i;        int j=i+1;        for(;j<n;++j)        {            if(ar[k]>ar[j])k=j;        }        if(i!=j)        {            int tmp=ar[i];ar[i]=ar[k];ar[k]=tmp;        }    }    for(i=0;i<n;++i)printf("%d ",ar[i]);    printf("函数进程2结束\n");}void *pthread_fun1(void *arg){    printf("函数线程1开始运行:开始打印100以内所欲素数::\n");    int i=2;    for(;i<100;++i)    {        int j=2;        for(j=2;j<=i/2;++j)        {            if(i%j==0)break;        }        if(j>i/2)printf("%d ",i);    }    printf("函数进程1结束\n");    pthread_exit("fun1 over");}void main(){    printf("主函数开始::\n");    pthread_t id1;    pthread_t id2;    int res=pthread_create(&id1,NULL,pthread_fun1,NULL);    assert(res==0);    int res2=pthread_create(&id2,NULL,pthread_fun2,NULL);    assert(res2==0);//  sleep(10);//如果主函数可能先结束,则用pthread_exit(NULL);     char *p=NULL;    pthread_join(id1,(void**)&p);//等待进程1结束,并获取结束信息    pthread_join(id2,NULL);//等待线程2结束    printf("%s\n",p);//打印获取到的进程1的结束信息;    printf("主函数结束\n");}

运行结果:
这里写图片描述