线程同步与线程安全

1、线程同步
1.1 互斥锁
概念: 实现线程访问临界资源的同步控制。如果一个线程在临界区开始时,
给互斥锁加锁,那么其他的线程就必须等待线程解锁,才能接着运行,并访问资
源。
操作: 初始化, 加锁、解锁、销毁锁
互斥锁: pthread_mutex_t 锁类型
锁初始化:
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutexattr_t *attr);
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
销毁锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
1.2 信号量----二进制信号量
操作: 初始化, P 操作V 操作销毁
函数: #include <semaphore.h>
int sem_init(sem_t *sem, int shared, int val); 初始化
int sem_wait(sem_t *sem); P 操作
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem); V 操作

int sem_destroy(sem_t *sem); 销毁


线程同步:条件变量

1.1 条件变量用于等待直到一个特定条件为真,它必须和互斥锁联合使用。

 相关原语如下:

cv_wait()    //阻塞直到该条件胡信号通知

cv_signal()      //唤醒阻塞在cv_wait()上一个线程

cv_broadcast()    //唤醒阻塞在cv_wait() 上所有进程

cv_wait() 在阻塞锁前释放关联胡互斥锁,并在返回前重新获得互斥锁。由于重新获得互斥锁可能被另一个等待这个互斥锁的线程阻塞,所以必须重新调试引发等待的进程。

读写锁

1.2多读者/单写者锁允许多个线程同时以只读权限访问锁中保护的对象,它还允许在排斥了所有读进程后,一次有一个线程作为写者访问该对象,当作为写者获得锁时,它呈现write lock状态:所有试图读或者写的线程都必须等待。如果一个或多个读进程获得了该锁,则它的状态为read lock。
原语如下
rw_enter() 试图作为读者或写着获得该锁
rw_exit()  作为读者或写者释放该锁
rw_tryenter() 如果不要求阻塞则获得该锁
rw_downgrade() 一个已经获得write lock的线程把它转换成read lock。任何正在等待的写线 程继续等待,直到该线程释放该锁。如果没有正在等待的写线程,则原语将唤醒任意一个挂起的 读线程。
rw_tryupgrade() 试图把reader lock 转换为 write lock

自旋锁

1.3作用:在linux中保护临界区。在同一时刻,只有一个线程能获得自旋锁,其他企图获得自旋锁的任何线程一直在尝试(即自旋)。


使用自旋锁
spin_lock()  
        spin_unlock()








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值