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

上海浦东刚刚发生的命案网站优化流程

上海浦东刚刚发生的命案,网站优化流程,网页制作公司挣钱吗,网页单页设计文章目录 多线程下自旋锁的行为逻辑1 自旋锁的基本逻辑2 线程状态分析3 自旋锁缺点4 自旋锁优化方式5 多核场景总结 多线程下自旋锁的行为逻辑 如果是自旋锁(spinlock)逻辑,当一个线程已经持有锁时,其他线程会不断尝试获取锁&…

文章目录

  • 多线程下自旋锁的行为逻辑
    • 1 自旋锁的基本逻辑
    • 2 线程状态分析
    • 3 自旋锁缺点
    • 4 自旋锁优化方式
    • 5 多核场景
    • 总结

多线程下自旋锁的行为逻辑

如果是自旋锁(spinlock)逻辑,当一个线程已经持有锁时,其他线程会不断尝试获取锁,处于“忙等(busy-waiting)”状态,不会主动休眠、挂起或进入阻塞态,除非你显式地这么写。


1 自旋锁的基本逻辑

std::atomic_flag lock = ATOMIC_FLAG_INIT;void lock_spin() {while (lock.test_and_set(std::memory_order_acquire)) {// 自旋:啥也不做,继续尝试获取锁}
}void unlock_spin() {lock.clear(std::memory_order_release);
}
  • test_and_set() 会原子地设置 locktrue,并返回旧值。
  • 如果另一个线程已设置 lock = true,那么当前线程会进入 while 循环 —— 这就是“忙等”。
  • 自旋期间线程不会释放 CPU,也不会进入 sleep 或 yield,仍然在占用计算资源。

2 线程状态分析

线程状态说明
持锁线程正常执行,直到 unlock()
自旋线程CPU 上循环尝试获取锁(高 CPU 占用),处于 Running 状态
阻塞线程不是自旋锁的行为,阻塞/挂起是互斥锁或条件变量做的事

在操作系统中,自旋线程的状态在调度器眼中通常是 “running”,如果被抢占则为 “ready”,而不是 “waiting” 或 “sleeping”。


3 自旋锁缺点

  • CPU 浪费大:线程处于忙等状态,浪费 CPU 周期。
  • 在多核下高竞争时非常低效。
  • 如果持锁线程长时间执行(或阻塞),自旋线程将毫无意义地消耗资源。

4 自旋锁优化方式

  1. 加上 pause/yield 提示 CPU 优化自旋:
while (lock.test_and_set(std::memory_order_acquire)) {std::this_thread::yield();  // Hint 给操作系统让出 CPU
}
  1. 自旋 + 回退 + sleep(适合高争用):
int count = 0;
while (lock.test_and_set(std::memory_order_acquire)) {if (++count > 1000) {std::this_thread::sleep_for(std::chrono::microseconds(10));  // 主动退让}
}

5 多核场景

  1. 可以有多个线程处于“运行态”吗?

可以有多个线程处于“就绪态(ready)”或“运行态(running)”,但实际同时运行的线程数量受限于 CPU 核心数。

  • 操作系统的线程调度器会维护多个状态:

    • Running:正在某个 CPU 核上执行。
    • Ready:准备好运行,但暂时没分配到 CPU。
    • Waiting/Sleeping/Blocked:在等 I/O、锁、条件变量等。
  • 如果你的系统是 4 核 CPU,那么最多可以同时运行 4 个线程(真正的并行)。

  • 其他线程即使“处于运行态”,但本质上是 ready 状态,被 OS 调度器等待调度。

  1. CPU 怎么决定“分配给谁”?
    由操作系统的 线程调度器(scheduler) 决定。调度策略有多种:
策略描述
时间片轮转(round-robin)每个线程轮流使用 CPU
优先级调度优先级高的线程更容易获得 CPU
多队列反馈结合线程运行情况动态调整优先级

调度器会考虑:

  • 线程优先级(nice 值、real-time 等)
  • 当前负载(load balancing)
  • CPU cache affinity(避免 cache miss)
  • 多核负载均衡(尽量让线程平均分布到各个核心)
  1. 多核 CPU 下的多线程运行模型
  • 多核 = 真正的“并行”执行

如果你有 8 核 CPU,你的 8 个线程可以真正在同一时间点并行执行,每个线程占用一个核心。线程之间通过共享内存、缓存一致性协议(如 MESI)等机制保持同步。

示例:4 个线程,4 核 CPU

时间核心 0核心 1核心 2核心 3
T0线程 A线程 B线程 C线程 D
T1线程 A线程 B线程 E线程 F

同时最多执行 4 个线程,剩下的在线程队列中等待调度。

  1. 自旋锁下,多线程抢锁是怎样的?
  • 每个核心上的线程在同时执行 while (lock.test_and_set()),此时所有核的线程都在自旋。
  • 哪个线程在某一时刻成功把 lock 从 false 设置为 true,它就赢得了执行权,进入临界区。
  • 其他线程仍然自旋,不会被挂起。
  1. 举个真实案例:8线程自旋 + 4核 CPU

  2. 线程 A 拿到自旋锁。

  3. 线程 B~H 也在尝试拿锁,它们会在各自 CPU 核或被调度时执行 while 自旋。

  4. 一旦线程 A 执行完 unlock(),调度器从剩下的线程中挑选一个抢锁成功。

  5. 其余线程继续自旋。


总结

情况自旋锁表现
锁未被持有线程获取锁,正常执行
锁被持有自旋线程持续运行,占用 CPU
高并发场景多线程争用,自旋浪费严重
最佳用途锁持有时间非常短的临界区,如 CPU 缓存级并发控制
问题回答
多个线程可以运行吗?可以,但并发度受限于 CPU 核数
谁获得 CPU 执行?操作系统调度器决定,基于策略
多核是怎么处理多线程的?各核独立运行线程,实现真正并行
自旋锁时线程状态?在运行或就绪态,不会自动 sleep
http://www.dtcms.com/wzjs/313705.html

相关文章:

  • 做不锈钢门的网站百度官方电话
  • 安仁做网站中国制造网网站类型
  • 行业平台网站建设淘宝指数在哪里查询
  • 怎么建立网站站点提高网站排名
  • wordpress搭建crm网站外部优化的4大重点
  • 网站开发 需求说明书百度浏览器官网
  • 网站 提示建设中大数据营销策略有哪些
  • 购物网站的开发新app推广方案
  • 公司后台的网站代理维护更新系统优化工具
  • 中山专业做网站的公司图片外链上传网站
  • 自建网站定位百度云搜索引擎网站
  • luolibobo wordpress上海网站关键词排名优化报价
  • 偃师市住房和城乡建设局网站今日时政新闻
  • 万网网站域名注册网页设计框架
  • 服装网站的建设策划太原百度关键词排名
  • 图片制作表情包怎么做seo引擎搜索
  • 建筑网站免费山东做网站
  • 可商用的图片素材网站企业seo外包公司
  • 做网站利用自己电脑百度seo排名软
  • 响应式网站 教程怎么制作网站详细流程
  • 松江专业做网站公司怎么打广告吸引客户
  • 海淘科技上海网站设计第三方营销平台有哪些
  • 巩义网站建设案例课堂随州网络推广
  • 企业网站空间多大合适百度指数怎么查
  • 广州网站开发设计公司排名检测
  • 邯郸做网站价格网站模板哪里好
  • 中国设计师联盟网站你就知道
  • 关于网站备案前置审批的相关说明 吉林网站交易
  • 网站域名备案 更改吗免费h5制作网站
  • 游戏开服网seo排名优化公司哪家好