Linux day9

互斥量

两个线程访问同一块共享资源,如果不协调顺序,容易造成数据混乱

加锁
mutex
pthread_mutex_init初始化
pthread_mutex_destroy摧毁
pthread_mutex_lock加锁
pthread_mutex_unlock(pthread_mutex_t*mutex)解锁

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

  • restrict约束该块内存区域对应的数据,只能通过后面的变量进行访问和修改
  • mutex互斥量---锁
  • attr互斥量的属性,可以不考虑,传NULL

互斥量的使用:

  • 初始化
  • 加锁
  • 执行逻辑---操作共享数据
  • 解锁
    注意事项:
    加锁需要最小力度,不要一直占用临界区。
    尝试加锁:
    int pthread_mutex_trylock(pthread_mutex_t*mutex);

死锁

  • 锁了又锁,自己加了一次锁,成功后又加了一次
  • 交叉锁

互斥量只是建议锁

读写锁

读写锁的特点:读共享,写独占,写优先级高
读写锁仍然是一把锁,有不同的状态:

  • 未加锁
  • 读锁
  • 写锁

读写锁的使用场景:适合读的线程多
初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
销毁读写锁:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
加读锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
加写锁:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

在这里插入图片描述
条件变量:
超时等待:
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
条件变量阻塞等待:
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);

  • 先释放锁mutex
  • 阻塞在cond条件变量上

销毁一个条件变量
int pthread_cond_destroy(pthread_cond_t *cond);
初始化一个条件变量
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
唤醒至少一个阻塞在条件变量cond上的线程
int pthread_cond_signal(pthread_cond_t *cond);
唤醒阻塞在条件变量cond上的全部线程
int pthread_cond_broadcast(pthread_cond_t *cond);

信号量

信号量是进化版的互斥量,允许多个线程访问共享资源
int sem_init(sem_t *sem, int pshared, unsigned int value);

  • sem定义的信号量,传出
  • pshared
    –0代表线程信号量
    –非0代表进程信号量

sem_destroy摧毁信号量
int sem_destroy(sem_t *sem);
申请信号量,申请成功value–
int sem_wait(sem_t *sem);

  • 当信号量为0时,阻塞

释放信号量value++
int sem_post(sem_t *sem);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值