• LINUX C系统编程学习笔记多线程编程


    多线程

    多线程线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程

    线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约   CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。 

    Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。 

    用到的头文件 pthread.h    库 libpthread.a

    创建线程

    int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, viod *(* start_rtn) (void), void *arg); 

    tidp:线程id

    attr:线程属性(一般为空)

    start_rtn:线程要执行的函数

    arg:start_rtn的参数

    编译时:gcc filename -lpthread

    终止进程

    线程的正常退出方式:

    (1).线程从启动例程中返回

    (2).线程可以被另一个进程终止

    (3).线程自己调用pthread_exit函数

    void pthread_exit(void *rval_ptr); //终止调用线程

    rval_ptr:线程退出返回值的指针 

    线程等待 

    int pthread_jion(pthread_t tid,void **rval_ptr);

    阻塞调用进程,直到指定的线程终止

    tid:等待退出的线程id

    rval_ptr:线程退出的返回值的指针

    线程标识 

    pthread_t pthread_self(void);

    获取调用线程的自身id

     

    清除 

    如果发现某段程序线程会中止(包括pthread_exit函数,但不包括return),用pthread_cleanup_push和pthread_cleanup_pop把它包围起来 。

    vod pthread_cleanup_push (viod(*rtn) (void *),void *arg);

    将清除函数压入清除栈

    rtn:清除函数

    arg:清除函数的参数

    void pthread_cleanup_pop(int execute);

    将清除函数弹出清除栈

    execute执行到pop时是否在弹出清理函数的 同时执行该函数,非0,执行,0则不执行。

    例: 

    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>

    void *clean(void *arg)
    {
        printf("cleanup:%s \n",(char *)arg);
        return (void *)0;
    }
    void *thr_fn1(void *arg)
    {
        printf("thread 1 start\n");
        pthread_cleanup_push((void *)clean,"thread 1 first handler");//运用清除函数
        pthread_cleanup_push((void *)clean,"thread 1 second handler");
        printf("thread 1 push complete\n");
        if (arg)
        {
            return((void *)1);
        }
        pthread_cleanup_pop(0);
        pthread_cleanup_pop(0);
        return (void *)1;
    }
    void *thr_fn2(void *arg)
    {
        printf("thread 2 start \n");
        pthread_cleanup_push((void *)clean,"thread 2 first handler");
        pthread_cleanup_push((void *)clean,"thread 2 second handler");
        printf("thread 2 push complete\n");
        if (arg)
        {
            return((void *)2);
        }
        pthread_cleanup_pop(0);
        pthread_cleanup_pop(0);
        return (void *)2;
    }
    int main(void)
    {
        int err;
        pthread_t tid1,tid2;
        void *tret;
        err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);//创建线程1
        if (err != 0 )
        {
            printf("error.....\n");
            return -1;
        }
        err = pthread_create(&tid2,NULL,thr_fn2,(void *)1);//创建线程2
        if (err != 0)
        {
            printf("error.....\n");
            return -1;
        }
        err = pthread_join(tid1,&tret);//线程1等待
        if (err != 0)
        {
            printf("error.....\n");
            return -1;
        }
        printf("pthread 1 exit code %d \n",(int) tret);
    }


     

     

    ----------------------------------------------在穷无非讨饭,不死终会出头。
  • 相关阅读:
    SAP 标准成本滚算小记
    记一次SAP新业务开发项目
    让人头疼的关键用户
    SAP GUI个性化设置
    惊心动魄的SAP S4客户额度调整运动
    最新.net和Java调用SAP RFC中间件下载
    那些年我遇到的ERP顾问
    【SAP业务模式】之STO(二):系统配置
    SAP S4系统创建Customer和Vendor的BAPI
    【SAP S/4 1511之变】:主数据之变
  • 原文地址:https://www.cnblogs.com/scrat/p/2583772.html
Copyright © 2020-2023  润新知