华清远见嵌入式学习day16——线程管理

【1】如何避免僵尸进程
       1.资源回收
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);
       功能:阻塞等待资源的回收
       参数:status 保存进程退出的状态
             如果传NULL,代表不关心进程的退出状态
       返回值:成功返回进程号,失败返回-1
       
       pid_t waitpid(pid_t pid, int *status, int options);
       功能:资源的回收
       参数:pid
                常用:  > 0   等待指定的pid进程结束
                        = -1  等待任意子进程的退出

                不常用:= 0      等待其组ID等于调用进程组ID的任意一子进程
                        < -1  等待其组ID等于|pid|的任意一子进程
            status: 保存进程退出的状态        
            options:标识如何等待进程的退出
                    0    阻塞等待
                    WNOHANG  不阻塞

    
        wait(NULL) ==   waitpid(-1,NULL,0)
        2.让它变为孤儿进程
        父进程-》bash
        孤儿进程-》init
        

【2】守护进程
    1.创建子进程,父进程退出;
        fork();
    2.在子进程中创建新会话
        setsid();
    3.改变当前目录为根目录
        chdir();
    4.重设文件权限掩码
        umask();
    5.关闭文件描述符
    。。。。。。。
    
【3】线程的概念
    为了提高系统的性能,许多操作系统引入了轻量级进程的概念,称为线程
    由于进程的地址空间是私有的,因此在进程间上下文切换,系统开销比较大
    线程是共享进程的地址空间的,因此上下文切换,系统开销比较小
    内核对进程和线程的调度是一样的
    线程既有共享资源,又有私有资源
    
【4】线程的相关操作
    
       创建线程
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

       功能:(回调函数)创建一个线程
       参数:thread    用来存线程的标识
             attr    线程的属性,一般用NULL,系统默认给填
             start_routine    函数指针,线程函数,
             arg     给线程函数传参
       返回值:成功返回0   失败返回错误码
    
       Compile and link with -pthread.
       

       
       删除线程
       #include <pthread.h>

       void pthread_exit(void *retval);
       功能:线程的退出
       参数:retval  线程退出的状态
       Compile and link with -pthread.
       
       线程阻塞函数
       #include <pthread.h>

       int pthread_join(pthread_t thread, void **retval);
       功能:阻塞等待指定线程的退出,回收其资源
       参数:thread   线程标识
             retval   线程的退出状态
       返回值:成功返回0  失败返回错误码
       Compile and link with -pthread.
【5】线程的控制:对临界资源的控制
    线程间同步与互斥
    信号量:实现同步
    互斥锁:实现互斥
【6】互斥锁:通过对临界资源进行加锁来实现互斥
    目的:来保证共享数据操作的完整性
       #include <pthread.h>

       int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);

       功能:互斥锁的初始化
       参数:mutex  锁的标识
             attr   锁的属性,一般用NULL
       返回值:成功返回0  失败返回错误码
       
       int pthread_mutex_lock(pthread_mutex_t *mutex);
       功能:阻塞等待上锁,直到上锁成功
       参数:mutex   锁的标识
       返回值:成功返回0 失败返回错误码
       
       int pthread_mutex_unlock(pthread_mutex_t *mutex);
       功能:解锁
       参数:mutex   锁的标识
       返回值:成功返回0 失败返回错误码
       
       int pthread_mutex_destroy(pthread_mutex_t *mutex);

       功能:销毁锁
       参数:mutex   锁的标识
       返回值:成功返回0  失败返回错误码
【7】信号量:实现同步
    信号量代表一类资源,其值表示系统中该资源的数量
    信号量是一个受保护的变量,只能通过三种操作来访问
    初始化
    p操作(申请资源)
    v操作(释放资源)
    
       #include <semaphore.h>

       int sem_init(sem_t *sem, int pshared, unsigned int value);
       功能:初始化信号量
       参数:sem   信号量的标识
             pshared:  0    线程与线程之间
                        非0  进程与进程之间
             value   要初始化的信号量的值
       返回值:成功0 失败返回-1
       Link with -pthread
    
       #include <semaphore.h>

       int sem_wait(sem_t *sem);
       功能:申请资源(p操作),申请一次,只能申请一个,如果没有资源,它会阻塞等待
       参数:sem   信号量的标识
       返回值:成功0 失败返回-1

       int sem_post(sem_t *sem);
       功能:释放资源(v操作)
       参数:sem   信号量的标识
       返回值:成功0 失败返回-1

       int sem_destroy(sem_t *sem);
       功能:信号量的销毁
       参数:sem   信号量的标识
       返回值:成功0 失败返回-1
       

猜你喜欢

转载自blog.csdn.net/UemTuBXuR/article/details/88956472