多线程安全

线程安全

概念:描述的是线程对临界资源的访问操作是安全的。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

实现:同步与互斥

互斥:通过对临界资源同一时间的唯一访问保证访问操作安全。
同步:通过条件判断使对临界资源访问或获取更加合理。

互斥的实现:互斥锁

互斥锁:本质是一个只有0和1的计数器,用于标记临界资源的访问状态。
0——不可访问;1——可访问
实现互斥的原理:在访问临界资源之前加锁,判断是否可访问,不可访问则阻塞,访问资源完毕后解锁(将资源状态置为可访问)。
互斥锁自身计数的操作是一个原子操作。
接口介绍:
1.定义互斥锁变量
pthread_mutex_t mutex;
2.初始化互斥锁变量
pthread_mutex_t mutex=PTHREAD_MUTEX_INITALIZER;
int pthread_mutex_t init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
thread_mutex_t mutex:互斥锁变量
3.在访问临界资源前加锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
4.在访问资源后解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
5.销毁互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);

同步的实现

通过条件判定实现对资源获取的合理性——条件变量
条件变量:pcb等待队列+能够使线程阻塞以及唤醒线程阻塞的接口。
条件变量实现同步中有等待队列,但是只提供了阻塞以及唤醒线程的接口,至于什么时候阻塞,什么时候唤醒线程需要程序员自己判断。
条件变量使用中,对条件判断有程序员自己完成,而条件判断的依据是一个临界资源访问时需要被保护,因此条件变量需要搭配互斥锁一起使用。
接口介绍:
1.定义条件变量
pthread_cond_t cond;
2.初始化条件变量
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
int pthread_cond_t init(pthread_cond_t *cond, pthread_condattr_t *attr);
3.使线程阻塞
int pthread_cond_t wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_t timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *abstime);
4.唤醒阻塞的线程
至少唤醒一个线程:int pthread_cond_t signal(pthread_cond_t *cond);

唤醒所有线程:int pthread_cond_t broadcast(pthread_cond_t *cond);
5.销毁条件变量
int pthread_cond_t destroy(pthread_cond_t *cond);
注意事项:
1.条件变量使用过程中,条件的判断应使用循环操作。
2.条件变量使用过程中若有多种角色则需要多个条件变量,不同的角色,分开等待,分开唤醒,防止唤醒角色错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值