1. 初始化信号量sem_initint sem_init(sem_t *sem, intpshared, unsigned intvalue);参数sem指向要初始化的信号量变量地址sem_t 是信号量的类型。pshared共享范围传 0线程间共享最常用信号量在当前进程的内存中仅本进程内线程可见。传非 0进程间共享信号量需放在共享内存中供多个亲缘进程使用。value信号量的初始值互斥场景设为 1等价于互斥锁同步场景设为 0用于等待事件触发资源计数场景设为资源总数如限制并发数2. 销毁信号量sem_destroyint sem_destroy(sem_t *sem);功能释放信号量占用的系统资源。注意事项必须确保没有线程阻塞在该信号量上时再销毁否则行为未定义。销毁后的信号量不能直接使用必须重新调用 sem_init 初始化后才能再次使用。3. P 操作申请资源 / 阻塞等待P 操作会将信号量值减 1根据信号量当前值的不同分为三个版本阻塞版sem_wait最常用int sem_wait(sem_t *sem);若信号量值 0立刻将值减 1函数返回。若信号量值 0调用线程阻塞挂起直到信号量值变为 0再执行减 1 并返回。非阻塞版sem_trywaitint sem_trywait(sem_t *sem);若信号量值 0减 1 成功返回 0。若信号量值 0不阻塞立刻返回 -1errno 置为 EAGAIN。适用于不能阻塞的场景获取失败可以去做其他任务。超时版sem_timedwaitint sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);若在超时时间内获取到信号量减 1 成功返回 0。超过指定时间仍未获取到返回 -1errno 置为 ETIMEDOUT。4. V 操作释放资源 / 唤醒等待int sem_post(sem_t *sem);功能将信号量的值原子性加 1。如果当前有线程阻塞在该信号量上会唤醒其中一个等待的线程。该操作是原子操作不会出现竞态问题且可以在信号处理函数中安全调用。
记录Linux线程(信号量函数)
1. 初始化信号量sem_initint sem_init(sem_t *sem, intpshared, unsigned intvalue);参数sem指向要初始化的信号量变量地址sem_t 是信号量的类型。pshared共享范围传 0线程间共享最常用信号量在当前进程的内存中仅本进程内线程可见。传非 0进程间共享信号量需放在共享内存中供多个亲缘进程使用。value信号量的初始值互斥场景设为 1等价于互斥锁同步场景设为 0用于等待事件触发资源计数场景设为资源总数如限制并发数2. 销毁信号量sem_destroyint sem_destroy(sem_t *sem);功能释放信号量占用的系统资源。注意事项必须确保没有线程阻塞在该信号量上时再销毁否则行为未定义。销毁后的信号量不能直接使用必须重新调用 sem_init 初始化后才能再次使用。3. P 操作申请资源 / 阻塞等待P 操作会将信号量值减 1根据信号量当前值的不同分为三个版本阻塞版sem_wait最常用int sem_wait(sem_t *sem);若信号量值 0立刻将值减 1函数返回。若信号量值 0调用线程阻塞挂起直到信号量值变为 0再执行减 1 并返回。非阻塞版sem_trywaitint sem_trywait(sem_t *sem);若信号量值 0减 1 成功返回 0。若信号量值 0不阻塞立刻返回 -1errno 置为 EAGAIN。适用于不能阻塞的场景获取失败可以去做其他任务。超时版sem_timedwaitint sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);若在超时时间内获取到信号量减 1 成功返回 0。超过指定时间仍未获取到返回 -1errno 置为 ETIMEDOUT。4. V 操作释放资源 / 唤醒等待int sem_post(sem_t *sem);功能将信号量的值原子性加 1。如果当前有线程阻塞在该信号量上会唤醒其中一个等待的线程。该操作是原子操作不会出现竞态问题且可以在信号处理函数中安全调用。