[linux】系统 线程操作
1.线程线程是一个轻量级的进程用来实现多任务并发。线程是操作系统任务调度的最小单位。进程是操作系统资源分配的最小单位。2.线程的创建线程由所在进程创建线程一定是属于某个进程的。线程创建时所在进程为其分配独立的栈区空间默认8M线程共用所在进程的堆区、数据区、文本区、内核区域。所以说返回的最大值为256 8个字节3. 进程与线程的区别4. 线程的调度宏观并行微观串行调度方式与进程一样5. 线程消亡1. 线程退出2. 回收线程资源空间6.线程相关函数接口创建线程pthread_createint pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);功能创建并启动一个线程参数thread 保存线程ID的变量地址attr 线程属性的变量地址NULL 按照默认属性创建start_routine函数指针指向线程执行的任务函数的指针线程任务函数arg 传递给线程任务函数的参数返回值成功0失败错误码!0注意1. 使用线程相关接口时编译和链接需要链接线程库-lpthread/-pthread2. 创建线程的主进程不能先于线程结束。while1卡住6.1.线程的回收线程退出及资源回收1. 线程执行结束return2. 线程所在进程结束3. pthread_exit退出线程7.线程的非分离属性线程的分离属性不需要被其他线程回收的线程称为具有分离属性的线程将来执行结束由操作系统回收。设置tid对应的线程为分离属性的线程。pthread_detach(tid.其他线程没有机会回收该线程时可以将该线程设置成分离属性线程的非分离属性可以被其他线程结束和回收的线程称为具有非分离属性的线程。所以具有非分离属性的线程结束后必须要被其他线程回收。默认属性非分离属性int pthread_join(pthread_t thread, void **retval);功能阻塞回收线程资源空间和状态参数thread要回收的线程的线程IDretval 保存线程状态的变量的地址NULL 表示不接收状态返回值成功0失败08. 线程的同步和互斥线程间通信全局变量、队列、pthread_create传参、条件变量线程间互斥机制多线程访问临界资源时存在资源竞争问题。临界资源多个线程可以同时访问的区域。如全局变量全局队列、文件、数据库临界区访问临界资源的这段代码称为临界区线程的互斥机制让多个线程访问临界资源时具有排他性访问的特性。互斥机制互斥锁1. 创建一个互斥锁对象pthread_mutex_t2. 初始化互斥锁 pthread_mutex_init();3. 加锁 pthread_mutex_lock();4. 解锁 : pthread_mutex_unlock();5. 销毁互斥锁pthread_mutex_destroy();int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);功能初始化一个锁对象参数mutex要初始化的锁对象的地址attr 锁属性的变量地址NULL按照默认属性创建返回值成功0失败!0其他锁读写锁读共享写独占自旋锁申请不到锁时一直占用CPU1. 创建信号量对象 : sem_t2. 初始化信号量 : sem_init();3. 申请信号量P操作: sem_wait();4. 释放信号量V操作: sem_post()5. 销毁信号量 : sem_destroy()int sem_init(sem_t *sem, int pshared, unsigned int value);功能初始化一个信号量参数sem信号量对象地址pshared0 : 线程间共享使用!0:进程间共享使用value信号量初始值返回值成功0失败!09. 死锁死锁死锁指的是在多线程环境中每个执行流线程都有未释放的资源且互相请求对方未释放资源从而导致陷入永久等待状态的情况。现象现象1忘记释放锁现象2重复加锁现象3多线程多锁抢占锁资源不当如线程A获取了1锁线程B获取了2锁同时线程A还想获取2锁线程B还想获取1锁产生死锁的四个必要条件四条全中 死锁破掉任意一条 解除1 互斥条件一个资源同一时刻只能被一个任务占用一个执行流获取锁后其它执行流不能再获取该锁。2 请求与保持条件已经拿着一部分资源不释放同时又去申请新的资源执行流本身使用着一把锁并不释放还在请求别的锁。3 不剥夺条件:资源只能由持有者主动释放系统/其他任务不能强行抢过来A执行流拿着锁其它执行流不能释放。4 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系多个执行流拿着对方想要的锁并且各执行流还去请求对方的锁。解决方法1.锁一定要成对出现2.使线程的加解锁顺序一致3.破坏环路等待条件使用非阻塞锁一旦线程发现请求的锁被使用就去释放自己拥有的资源int pthread_mutex_trylock(pthread_mutex_t *mutex);int sem_trywait(sem_t *sem);