您当前的位置: 首页 > 技术文章 > 前端开发

2023-01-16 mysql列存储引擎-多线程聚合-pack异步释放-需求分析

作者: 时间:2023-02-03阅读数:人阅读

摘要:

目前在聚合多线程扫表的时, 遇到在线程切换时, 当LOCK_ONE策略导致其他线程的pack被释放引发crash的问题。并且当LOCK_ONE时, 每读取一个新的pack就会释放持有的旧的pack, 这样性能也不好.

考虑将pack的释放设计为异步的策略, 由独立的线程来完成对pack的释放.

多线程聚合在扫表时由于LOCK_ONE策略将发生在线程切换时候pack地址丢失.

除去已经新增的LOCK_ALL和LOCK_LRU策略, 考虑线程pack标识来作为控制。

遇到的问题:

  1. 独立的清理线程, 是新写一个独立的线程, 还是用现有的thread_pool?
  2. 用来标识pack是否正在使用的标识的数据结构如何设计?
  3. 如果对工作线程和清理线程的临界区设置线程同步策略?
    1. 要不要使用锁?
      1. 使用锁的坏处是什么, 会造成多大的坏处
      2. 锁的使用规则是什么? 为什么要加锁?
    2. 还是使用CAS?
      1. CAS的原子变量和标识的数据结构如何配合?
  4. 工作线程设置和清理pack标识的接口
    1. LockPack
      1. 读取一个新pack时
      2. 设置读取的pack标识, 并清理保存的上一个pack的标识
      3. pack的标识为临界区, 与清理线程存在线程间同步
      4. 当能从缓存的pack池内查到, 并且标识位被清除导致pack被清理时, 重置该pack的标志位, 不清理该pack,继续使用缓存到的pack
    2. UnlockAll
      1. 释放时也仅仅是对pack标识的处理
      2. 不阻塞工作线程
  5. 清理线程的休眠和唤醒规则
    1. 是否要用条件

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:licqi@yunshuaiweb.com

加载中~