线程

线程

  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");
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值