线程学习(三)

生产者与消费者模型:

 生产者抓取数据,将数据放到缓存区​​中,消费者从缓冲区拿到数据进行处理。
​​​​​​​​​​​​在这里插入图片描述
  消费者为什么不直接获取数据,而要经过生产者?
    提高效率,数据安全程度提高。
 特性:

一个场所: 存放资源场所
两类角色: 生产者,消费者
三种关系:(保证资源安全访问)
  生产者与生产者 ----> 互斥
  消费者与消费者 ----> 互斥
  生产者与消费者 ----> 同步&互斥

信号量

  实际上是一个具有等待队列的计数器,它记录了资源的数目。
   目的:实现进程/线程的同步与互斥。
   Linux中有POSIX标准信号量(库函数实现) 和 system v信号量 (系统调用)

 这里介绍POSIX信号量的使用:
          #include <semaphore.h>

sem_tsem_t sem创建信号量
sem_initsem_init(sem_t *sem, int pshared, unsigned int value);初始化
sem_destroysem_destroy(sem_t *sem);销毁
sem_waitsem_wait(sem_t *sem);阻塞等待
sem_trywaitsem_trywait(sem_t *sem);非阻塞等待
sem_timedwaitsem_timedwait(sem_t *sem, const struct timespec *abs_timeout);阻塞限时等待
sem_postsem_post(sem_t *sem);唤醒等待队列中的进程/线程

读写锁

  •  为什么有读写锁?

由于互斥锁只能做到读写互斥,而读共享没办法做到,所以有读写锁来完成。

 实现:

write 写的时候判断写计数和读计数,若都为0则可以写操作,否则阻塞。
read 读的时候只能要判断写计数,若为0,则可以读,否则阻塞。

  这里的阻塞与以前不同,以前是死等,这里的阻塞是自旋式(不满足条件,一直循环判断)。所以读写锁就是计数加自旋锁实现的。

  •  那为什么要一直等?

因为我们知道等待的时间不长,所以循环判断。

 使用场景: 操作时间短,并且读的操作多,写的操作少。

 特性: 写互斥,读共享(但读与写也互斥)默认读优先
     不能等待时间太长,否则过大耗费CPU。

 读写锁接口:
#include <pthread.h>

pthread_rwlock_initpthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);初始化
pthread_rwlock_destroypthread_rwlock_destroy(pthread_rwlock_t *rwlock);销毁
pthread_rwlock_rdlockpthread_rwlock_rdlock(pthread_rwlock_t *rwlock);获取阻塞性的读锁
pthread_rwlock_tryrdlockpthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);获取非阻塞性的读锁
pthread_rwlock_wrlockpthread_rwlock_wrlock(pthread_rwlock_t *rwlock);获取阻塞性的写锁
pthread_rwlock_trywrlockpthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);获取非阻塞性的写锁
pthread_rwlock_unlockpthread_rwlock_unlock(pthread_rwlock_t *rwlock);解锁
pthread_rwlockattr_initpthread_rwlockattr_init(pthread_rwlockattr_t *attr);读写锁变量属性初始化
pthread_rwlockattr_destroypthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);释放读写锁变量
pthread_rwlockattr_setkind_nppthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);设置读写锁属性优先级(默认读优先)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值