当前位置: 首页 > news >正文

线程同步的几种方式

目录

  • 互斥锁
  • 条件变量
  • 读写锁
  • 信号量
  • CAS
  • -- 参考

线程同步方式有互斥锁,条件变量,信号量,读写锁,CAS锁等方式

互斥锁

  • 互斥量 pthread_mutex_t
  • 在执行操作之前加锁,操作完之后解锁. 使用互斥量,来确保同一时刻只有一个线程访问某项共享资源。
  • A线程加锁了,B线程无法释放A线程加的锁,只能等A线程自己释放,锁释放后再竞争锁
pthread_mutex_t lock;//创建锁
pthread_mutex_init();//初始化锁
pthread_mutex_lock();//加锁
pthread_mutex_unlock();//解锁
pthread_mutex_destroy();//销毁锁

条件变量

  • 条件变量可以同时唤醒一个或多个线程,信号量只能唤醒一个,唤醒多个线程的时候,通常涉及到资源竞争,往往配合互斥锁使用
  • 条件变量是线程的另一种同步机制,它和互斥量是一起使用的。互斥量的目的就是为了加锁,而条件变量的结合,使得线程能够以等待的状态来迎接特定的条件发生,而不需要频繁查询锁。
pthread_cond_t cond; //创建条件变量
pthread_cond_init();//初始化条件变量
pthread_cond_wait();//线程进入阻塞,等待信号被唤醒
pthread_cond_timedwait();//线程进入阻塞,一定时间后被唤醒
pthread_cond_signal();//满足条件后一次通知一个
pthread_cond_broadcast();//满足条件后一次通知多个
pthread_cond_destroy(); //销毁条件变量

读写锁

  • 以读方式给数据加锁--------读锁。以写方式给数据加锁---------写锁。
    读共享,写独占。
    写锁优先级高。
  • 当线程A处于读的状态,线程B也可以读,但是不能写,当线程A处于写的状态,线程B则不能读,适用与少写多读的场景
pthread_rwlock_t rwlock;//创建读写锁
pthread_rwlock_init();//初始化锁
pthread_rwlock_rdlock();//加读锁
pthread_rwlock_wrlock();//加写锁
pthread_rwlock_trywrlock();//try锁
pthread_rwlock_unlock();//解锁
pthread_rwlock_destroy();//销毁锁多的时候,提高访问效率

信号量

  • 信号量是一种特殊的变量,用来控制对临界资源的使用,在多个进程或线程都要访问临界资源的时候,就需要控制多个进行或线程对临界资源的使用。
  • 信号量机制通过p、v操作实现。p操作:原子减1,申请资源,当信号量为0时,p操作阻塞;v操作:原子加1,释放资源。
  sem_t sem;int sem_init(sem_t *sem, int pshared, unsigned int value);//初始化//pshared传零用于线程间同步,传1用于进程和线程间同步//value也就是Nint sem_wait(sem_t *sem);//加锁系信号量,信号量大于0,信号--操作,信号量等于0阻塞int sem_trywait(sem_t *sem);//try锁int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);//限时尝试对信号进行加锁int sem_post(sem_t *sem);//解锁,将信号量++,同时唤醒阻塞在信号量上的线程int sem_destroy(sem_t *sem);//销毁信号量

CAS

  • CAS是基于乐观锁的线程同步方式
  • CAS算法的作用:解决多线程条件下使用锁造成性能损耗问题的算法,保证了原子性,这个原子操作是由CPU来完成的
    CAS的原理:CAS算法有三个操作数,通过内存中的值(V)、预期原始值(A)、修改后的新值。
    (1)如果内存中的值和预期原始值相等, 就将修改后的新值保存到内存中。
    (2)如果内存中的值和预期原始值不相等,说明共享数据已经被修改,放弃已经所做的操作,然后重新执行刚才的操作,直到重试成功。
// 伪代码
template <class T>
bool CAS(T* addr, T expected, T target) 
{if (*addr == expected) {*addr = target;return true;}return false;
}

– 参考

https://www.cnblogs.com/Chlik/p/13556720.html
http://t.csdnimg.cn/GB6En
https://www.zhihu.com/question/485896579
https://zhuanlan.zhihu.com/p/400817892

http://www.lryc.cn/news/193532.html

相关文章:

  • Linux网络编程系列之服务器编程——多路复用模型
  • 在SQL语句里使用正则表达式,因该怎么使用
  • 扫码登录-测试用例设计
  • PyTorch CUDA GPU高占用测试
  • Java|学习|abstract ,接口 Interface , Object
  • 安全的Sui Move是Web3大规模采用之路的基石
  • Python中图像相似性度量方法汇总
  • pycharm中快速对比两个.py文件
  • C++程序结束
  • 嵌入式学习-核心板、开发板和单片机
  • 【pycharm】控制台报错:终端无法加载文件\venv\Scripts\activate.ps1
  • Python算术运算符:加减乘除 整除 取余 幂指数 小括号
  • 访问者模式:对象结构的元素处理
  • ChatGPT快速入门
  • 链表的实现(c语言)
  • 【Redis】渐进式遍历
  • uni-app开发微信小程序的报错[渲染层错误]排查及解决
  • 三、C语言常用运算符
  • ubuntu联网图标消失
  • 中华人民共和国网络安全法
  • Java并发面试题:(二)线程池参数和使用
  • Python机器学习零基础理解AffinityPropagation亲和力传播聚类
  • Open3D 进阶(12)PCA拟合空间直线
  • 4种实现JS深拷贝的方法
  • 六、RocketMQ发送事务消息
  • Node.js初体验
  • 激活函数理解
  • 【docker - 安装】windows 10 专业版 安装docker,以及 WSL kernel version too low 解决方案
  • 洛谷P1601
  • Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人