线程间通信

线程是操作系统调度的最小单位,当多个线程需要共同操作同一共享资源时,需要同步状态避免引起共享资源竞争和不可预知的结果

  • 条件变量
    变量是线程间共享全局变量进行同步的一种机制,访问共享资源时先加锁,条件不满足时等待触发(先解锁后再挂起,不占用CPU),等待其他线程激活后再加锁使用共享资源
    初始化条件变量:
    int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
    循环和计时等待:
    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
    int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
    激活单个和所有线程:
    int pthread_cond_signal(pthread_cond_t *cond);
    int pthread_cond_broadcast(pthread_cond_t *cond);
    销毁条件变量:
    int pthread_cond_destroy(pthread_cond_t *cond);

  • 互斥锁
    互斥锁是同一时刻只允许一个线程执行锁中的代码
    初始化锁:
    int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
    阻塞和非阻塞加锁:
    int pthread_mutex_lock(pthread_mutex *mutex);
    int pthread_mutex_trylock( pthread_mutex_t *mutex);
    解锁:
    int pthread_mutex_unlock(pthread_mutex *mutex);
    销毁锁:
    int pthread_mutex_destroy(pthread_mutex *mutex);

  • 自旋锁
    自旋锁类似互斥锁,区别为在锁被其他线程持有时会持续的获取锁状态
    优点:一直处于用户态,不进行睡眠和线程上下文切换,执行效率高(互斥锁涉及内核调度线程上下文切换)
    缺点:循环时间长的话过度消耗cpu资源,影响其他线程的cpu资源使用
    特点:在内核中,被自旋锁保护的代码执行中不能睡眠,单核处理器下会死锁,多核中两个线程在同一处理器下也可能死锁,所以现在的处理器都会设置自旋时间上限防止死锁,另外自旋锁在单核非抢占式cpu是无效的,在单核抢占式cpu禁止内核抢占并不实现自旋,在多核可抢占cpu为禁止内核抢占且可自旋
    初始化和销毁锁:
    int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
    int pthread_spin_destroy(pthread_spinlock_t *lock);
    加锁和解锁:
    int pthread_spin_lock(pthread_spinlock_t *lock);
    int pthread_spin_trylock(pthread_spinlock_t *lock);
    int pthread_spin_unlock(pthread_spinlock_t *lock);

  • 读写锁
    读写锁是同一时刻只允许多个读者或者一个写者执行锁中的代码
    初始化:
    int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
    加解锁:
    int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
    int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
    销毁锁:
    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

  • 信号量
    线程间和进程间一样,也可以使用信号量进行信息同步
    初始化:
    int sem_init (sem_t *sem , int pshared, unsigned int value);
    增加信号量值,v操作
    int sem_post(sem_t *sem);
    减少信号量值,p操作
    int sem_wait(sem_t *sem);
    销毁信号量:
    int sem_destroy(sem_t *sem);

  • 线程间通信方式比较线程间通信比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值