线程同步与互斥

    与多进程交互一样,各个不同的线程之间也会存在资源的共享问题。为了解决多线程之间对资源访问的同步和互斥问题,我们需要了解线程同步机制。
第一种机制:互斥锁
互斥锁是一种简单的加锁方法,可以使单个线程进行对资源访问的原子操作。
互斥锁的基本操作就是加锁和解锁。互斥锁主要包含以下函数:
(1) 初始化函数:pthread_mutex_init();
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr)
函数说明:mutex:互斥锁
mutexattr:(1)PTHREAD_MUTEX_INITILAZER:创建快速互斥锁(一般默认属性是创建这个) (2)PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁
(3)PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检测互斥锁
成功返回0,错误返回错误码。
(2)互斥锁上锁:pthread_mutex_lock(pthread_mutex_t *mutex);
判断互斥锁上锁:pthread_mutex_trylock(pthread_mutex_t *mutex);
互斥锁解锁:pthread_mutex_unlock(pthread_mutex_t *mutex);
互斥锁的消除:pthread_mutex_destory(pthread_mutex_t *mutex);
成功返回0,出错返回-1.
第二种机制:信号量
linux实现了POSIX的无名信号量,用于线程中的互斥和同步。信号量就是操作系统中的所用到的PV原子操作。同时适用于进程或线程的同步与互斥。
函数说明:
sem_init()创建一个信号量,并进行初始化
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);
函数说明:
sem:信号量的指针
pshared:决定是否信号量被共享,这个值取0,表示当前的局部信号量。
value:需要初始化的值
函数成功返回0,错误返回-1.
sem_wait(sem_t *sem)和sem_trywait(sem_t *sem)相当于P操作,在信号量大于0的时候能够将信号量的值减一;区别是若信号量的值小于0时,sem_wait会将其阻塞,而后者立即返回。
sem_post(sem_t *sem)相当于V操作,它将信号量的值加一
sem_getcalue(sem_t *sem)用于得到信号量的值
sem_destroy(sem_t *sem)用于删除信号量
成功返回0,错误返回-1.


例子会后面补充,参看linux代码类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值