linux(十一)

来源:互联网 发布:windows phone软件下载 编辑:程序博客网 时间:2024/06/06 12:23
一.多线程        1.了解多线程                解决多任务实现。                历史上Unix服务器不支持多线程                Unix/Linux上实现多线程有两种方式:                    内核支持多线程                    使用进程的编程技巧封装进程实现多线程:轻量级多线程                多线程的库:                        libpthread.so     -lpthread                        pthread.h                       2.创建多线程                    2.1.代码?                                回调函数                    2.2.线程ID?                                pthread_t                    2.3.运行线程?                                pthread_create            int pthread_create(                    pthread_t *th,//返回进程ID                    const pthread_attr_t  *attr,//线程属性,为NULL/0,使用进程的默认属性                    void*(*run)(void*),//线程代码                    void *data);//传递线程代码的数据            结论:                    1.程序结束所有子线程就结束                            解决办法:等待子线程结束                                                sleep/pause                            int pthread_join(                                    pthread_t tid,//等待子线程结束                                    void **re);//子线程结束的返回值                    2.创建子线程后,主线程继续完成系统分配时间片。                    3.子线程结束就是线程函数返回。                    4.子线程与主线程有同等优先级别.        3.线程的基本控制                线程的状态:                        ready->runny->deady                                         |                                 sleep/pause                 结束线程?                                        内部自动结束:(建议)                            return  返回值;(在线程函数中使用)                            void pthread_exit(void*);(在任何线程代码中使用)                                               外部结束一个线程.                                                   pthread_cancel(pthread_t);                线程开始        4.多线程的问题                数据脏        5.多线程问题的解决                互斥锁/互斥量  mutex                1.定义互斥量pthread_mutex_t                2.初始化互斥量 1 pthread_mutex_init                3.互斥量操作     置0 phtread_mutex_lock                                                 判定互斥量0:阻塞                                                                    1:置0,返回                                        置1 pthread_mutex_unlock                                                        置1返回                            强烈要求成对使用                                            4.释放互斥量pthread_mutex_destroy            结论:                    互斥量保证锁定的代码一个线程执行,                    但不能保证必需执行完!                                                         5.在lock与unlock之间,调用pthread_exit?                        或者在线程外部调用pthread_cancel?                    其他线程被永久死锁.                6.pthread_cleanup_push {                    pthread_cleanup_pop  }                      这对函数作用类似于atexit                    注意:                        这不是函数,而是宏.                      必须成对使用         6.多线程的应用 二.多线程同步        互斥量/信号/条件量/信号量/读写锁            1.sleep与信号                pthread_kill向指定线程发送信号                signal注册的是进程的信号处理函数.                pthread_kill+sigwait控制进程                1.1.定义信号集合                1.2.初始化信号集合                1.3.等待信号                    1.4.其他线程发送信号                    1.5.清空信号集合      案例:                sigwait实际处理了信号                如果进程没有处理信号,目标线程也没有sigwait                ,则进程会接收信号进行默认处理            2.条件量                        信号量类似                        2.1.定义条件量                        2.2.初始化条件量                        2.3.等待条件量                           2.4.其他线程修改条件量                        2.5.释放条件量案例:            创建两个线程.                一个线程等待信号                一个线程每隔1秒发送信号                1.使用pause+pthread_kill            pthread_cond_*** 与sigwait都是进程同步控制            pthread_cond_***稳定            pthread_cond_***在环境下不会死锁.课堂练习:            使用条件量与互斥构造死锁程序.
0 0