如何优雅的实现一个自旋锁(c++20)

发布时间:2026/11/13 3:13:00
如何优雅的实现一个自旋锁(c++20) 引言因为c提供了很多的锁信号量还有辅助创建锁的工具但是没有提供跨平台性很好的自旋锁所以我们利用辅助创建锁的工具只需要提供lock(),try_lock(),unlock()三个API这样子就可以创建出我们的自旋锁。自旋锁自旋锁SpinLock就是线程抢不到锁时不进入休眠而是在 CPU 上不停地循环检查直到锁被释放自旋锁一般要配合CPU的优化因为不停的忙等会导致CPU的性能下降所以我们需要告诉CPU这个地方不需要一直忙等而是时不时来看一眼。inline void cpu_relax() noexcept { #if defined (__x86_64__) || defined (__i386__) _mm_pause(); #endif }这个是我们自己写的自旋锁我们的锁是std::atomic_flag一般实现自旋锁就是这个因为这个只可以设置false / true解释一下lock函数外层循环里面查看锁是否可以拥有如果是false那么就设置为true并且返回原来的状态false这个样子不仅仅表示拥有了锁而且跳出了循环。当第二个线程来的时候因为被设置为了true所以返回true并且不会改变锁的状态。进入内部的循环并且因为如果外部没有释放锁那么一直是true所以内部一直循环里面也做了CPU的优化。当外部锁被释放跳出内部循环重新进入外部循环然后跳出外部循环。class SpinLock { public: using Lock std::lock_guardSpinLock; SpinLock() noexcept default; ~SpinLock() noexcept default; SpinLock(const SpinLock) delete; SpinLock operator(const SpinLock) delete; void lock() noexcept { while(mutex_.test_and_set(std::memory_order_acquire)) { while(mutex_.test(std::memory_order_relaxed)) { cpu_relax(); } } } // 不可以忽略掉返回值也就是要bool a try_lock(); [[nodiscard]] bool try_lock() noexcept { return !mutex_.test_and_set(std::memory_order_acquire); } void unlock() noexcept { mutex_.clear(std::memory_order_release); } private: std::atomic_flag mutex_ ATOMIC_FLAG_INIT; // 0 };最后我们使用的时候只需要传入我们的SpinLock即可因为辅助的创建锁工具是一个模板类这个类里面只要实现了特定的接口那么就可以使用这个锁。template typename Mutex std::chrono::nanoseconds BenchmarkMutex(std::size_t thread_count) { Mutex mutex; Counter_ 0; const auto elapsed BenchmarkThreads(thread_count, [](std::size_t, u64 operations) { for(u64 index 0; index operations; index) { std::lock_guardMutex lock(mutex); Counter_; } }); if (Counter_ ! target_) { throw std::runtime_error(mutex correctness check failed); } return elapsed; }总结本篇文章到这里就结束了希望可以帮助大家理解~~~

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询