多线程并发锁的方案—原子操作

简介: 多线程并发锁的方案—原子操作

多线程并发方案(自旋锁)之后。

原子操作:单条CPU指令

三条指令变为一条。

工程实践中用到的原子操作:

  • CAS --> Compare And Swap (对比然后赋值)

原理:

1. if(a == b){
2. 
3.     a = c;    
4. 
5. }

单例模式,赋值的时候先判断,判断a的值有没有被改变,在进行赋值。

原子操作:

代码:

#include <stdio.h>
#include <pthread.h>
#define THREAD_COUNT  10
pthread_mutex_t mutex;
pthread_spinlock_t spinlock;
int inc(int *value, int add) {    //参数1.传入值得地址 参数2.增加的步长
  int old;
  __asm__ volatile(
    "lock; xaddl %2, %1;"      //将第二个参数的值加上第一个参数的值,赋给第一个参数
    : "=a" (old)               //"=a"说的寄存器
    : "m" (*value), "a"(add)   //"m"说的是内存
    : "cc", "memory"
  );
void *thread_callback(void *arg) {
  int *pcount = (int *)arg;
  int i = 0;
  while (i ++ < 100000) {
#if 0
    (*pcount) ++; //
#elif 0
    pthread_mutex_lock(&mutex);
    (*pcount) ++; //
    pthread_mutex_unlock(&mutex);
#elif 0
    pthread_spin_lock(&spinlock);
    (*pcount) ++; //
    pthread_spin_unlock(&spinlock);
#else
    inc(pcount, 1);
#endif
    usleep(1);
  }
}
int main () {
  pthread_t threadid[THREAD_COUNT] = {0};
  pthread_mutex_init(&mutex, NULL);
  pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);
  int i = 0;
  int count = 0;
  for (i = 0;i < THREAD_COUNT;i ++) {
    pthread_create(&threadid[i], NULL, thread_callback, &count);
  }
  for (i = 0;i < 100;i ++) {
    printf("count : %d\n", count);
    sleep(1);
  }
}

代码结果:

总结:

对于此项目方案原子操作比自旋锁互斥锁更好一些!


相关文章
|
2月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
170 2
|
2月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
265 1
|
5月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
363 83
|
5月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
342 83
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
7月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
263 0
|
7月前
|
设计模式 运维 监控
并发设计模式实战系列(4):线程池
需要建立持续的性能剖析(Profiling)和调优机制。通过以上十二个维度的系统化扩展,构建了一个从。设置合理队列容量/拒绝策略。动态扩容/优化任务处理速度。检查线程栈定位热点代码。调整最大用户进程数限制。CPU占用率100%
478 0
|
7月前
|
存储 缓存 安全
JUC并发—11.线程池源码分析
本文主要介绍了线程池的优势和JUC提供的线程池、ThreadPoolExecutor和Excutors创建的线程池、如何设计一个线程池、ThreadPoolExecutor线程池的执行流程、ThreadPoolExecutor的源码分析、如何合理设置线程池参数 + 定制线程池。
JUC并发—11.线程池源码分析
|
6月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
190 0

热门文章

最新文章