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

C/C++ Wait Morphing锁内通知 锁外通知

template<typename T>
class BlockingQueue : noncopyable
{public:// 使用deque的原因:前插,尾插为O(1)消息队列尾巴放,前面拿// 为什么不list? // 因为deque有良好的缓存性,cache缓存,list 地址不同using queue_type = std::deque<T>;BlockingQueue(): mutex_(),notEmpty_(mutex_),queue_(){}//实现左值右值void put(const T& x){MutexLockGuard lock(mutex_);queue_.push_back(x); //尾插notEmpty_.notify(); // wait morphing saves us// http://www.domaigne.com/blog/computing/condvars-signal-with-mutex-locked-or-not/}void put(T&& x){MutexLockGuard lock(mutex_);queue_.push_back(std::move(x));notEmpty_.notify();}T take(){MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty()){notEmpty_.wait();}assert(!queue_.empty());T front(std::move(queue_.front()));queue_.pop_front();return front;}queue_type drain(){std::deque<T> queue;{MutexLockGuard lock(mutex_);queue = std::move(queue_);assert(queue_.empty());}return queue;}size_t size() const{MutexLockGuard lock(mutex_);return queue_.size();}private:mutable MutexLock mutex_;Condition         notEmpty_ GUARDED_BY(mutex_);queue_type        queue_ GUARDED_BY(mutex_);
};  // __attribute__ ((aligned (64)));}  // namespace muduo#endif  // MUDUO_BASE_BLOCKINGQUEUE_H

锁内通知(notify with mutex locked):通知时当前线程持有锁,可能导致被唤醒的线程立即尝试获取锁,但因为锁还未释放,唤醒的线程会立即重新睡眠(spurious wakeup 或调度开销)。锁外通知(notify without mutex locked):通知时锁已释放,可能导致信号丢失(lost signal),即通知发生在等待线程检查条件之前。

  • 锁内通知(notify with mutex locked):通知时当前线程持有锁,可能导致被唤醒的线程立即尝试获取锁,但因为锁还未释放,唤醒的线程会立即重新睡眠(spurious wakeup 或调度开销)。
  • 锁外通知(notify without mutex locked):通知时锁已释放,可能导致信号丢失(lost signal),即通知发生在等待线程检查条件之前。

“Wait Morphing” 是什么?

当一个线程在持有锁时调用 notify,线程库不会立即唤醒等待线程并让其竞争锁。相反,线程库会将等待线程的 “等待状态” 直接转换为 “就绪状态”,并在当前线程释放锁时无缝地将锁交给被唤醒的线程。这种优化避免了被唤醒线程立即竞争锁失败并重新睡眠的情况,减少了上下文切换和调度开销。

  • 当一个线程在持有锁时调用 notify,线程库不会立即唤醒等待线程并让其竞争锁。
  • 相反,线程库会将等待线程的 “等待状态” 直接转换为 “就绪状态”,并在当前线程释放锁时无缝地将锁交给被唤醒的线程。
  • 这种优化避免了被唤醒线程立即竞争锁失败并重新睡眠的情况,减少了上下文切换和调度开销。

http://www.dtcms.com/a/504104.html

相关文章:

  • 衡水景县专业做淘宝网站公司门户网站运营
  • 网游网站开发打造一个app需要多少钱
  • golang定时器
  • 【NVIDIA显卡驱动和GPU管理工具—nvidia-driver 和 nvidia-smi 简介】
  • 学校网站建设目的WordPress浮动导航插件
  • 快速上手大模型:机器学习4
  • 短波红外相机的简单介绍和场景应用
  • Python图形化界面——pyqt5教程
  • 人和兽做的网站视频学动漫设计去哪个学校
  • 东莞响应式网站建设定制石家庄造价工程信息网
  • 榆林网站建设公司12306的网站是哪个公司做的
  • PCIe协议之 Equalization篇 之 如何重新发起 EQ?
  • 贵阳网站建设我国网络营销现状分析
  • FPGA的时钟输入和JESD204B 接口对时钟的要求
  • 佛山多语网站制作公司网站官网
  • 企业官网的应用场景视频网站seo怎么做
  • 济南企业建设网站网页制作好了如果让别人搜到
  • Java零基础入门:面向对象讲解 --- OOP(上)
  • python | requests爬虫如何正确获取网页编码?
  • C语言对单链表的操作
  • DeepLab系列算法介绍
  • apache设置网站网址怎样将ftp转换为wordpress
  • .net和php哪个做网站好红色简约的手机社区类网站html5响应式模板下载
  • 民兵信息化网站建设wordpress页面添加照片
  • Docker 安装 CentOS
  • 做黑彩票的网站赚钱吗微信公众号怎么做好看
  • 内蒙古集宁建设厅官方网站国外app设计网站
  • C++ vector类的使用
  • 咸阳建设局网站自己公司怎样弄个网站
  • 网站做推广需要什么条件免费制作招聘的app