全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现线程锁(mutex)?(多线程同步)

C++线程锁核心是保护共享数据免受竞态条件,推荐用RAII的std::lock_guard或C++17的std::scoped_lock自动管理,避免裸调lock()/unlock()导致死锁;多锁时须按固定顺序加锁,可用std::lock或std::scoped_lock确保安全。

在C++中,线程锁(mutex)主要通过 std::mutex 及其配套类实现,核心目标是保护共享数据不被多个线程同时修改,避免竞态条件。关键不是“加锁”本身,而是“在访问临界资源前加锁、用完立刻解锁”,且必须成对出现。

基础用法:std::mutex + lock()/unlock()

最直接的方式是手动调用 lock()unlock()

  • 声明一个全局或类成员的 std::mutex mtx;
  • 在访问共享变量前调用 mtx.lock();
  • 操作完成后立即调用 mtx.unlock();
  • ⚠️注意:如果中间抛异常,unlock() 可能被跳过,导致死锁——所以不推荐裸用

推荐方式:RAII自动管理(std::lock_guard)

std::lock_guard 在作用域开始时加锁,离开作用域时自动解锁,安全可靠:

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard guard(mtx); // 构造即加锁
    ++counter;                              // 访问临界区
} // guard析构,自动unlock —— 即使这里抛异常也安全

进阶控制:std::unique_lock(支持延迟加锁、转移所有权)

当需要更灵活的锁控制(比如尝试加锁、超时、或把锁传给其他函数)时,用 std::unique_lock

  • std::unique_lock<:mutex> lk(mtx, std::defer_lock); —— 声明时不加锁
  • lk.lock(); / lk.try_lock(); / lk.unlock(); —— 手动控制
  • 支持移动语义,可作为函数参数传递(std::unique_lock 可移动,std::lock_guard 不可)

避免死锁:按固定顺序加多个锁(std::lock)

多个 mutex 同时使用时,若线程A先锁a再锁b、线程B先锁b再锁a,容易死锁。用 std::lock(a, b) 一次性锁住多个,内部保证无序竞争:

std::mutex mtx1, mtx2;
std::lock(mtx1, mtx2);           // 安全获取两个锁
std::lock_guard g1(mtx1, std::defer_lock);
std::lock_guard g2(mtx2, std::defer_lock);
// 或直接用 std::scoped_lock(C++17起,更简洁)
std::scoped_lock lock(mtx1, mtx2); // 推荐

基本上就这些。记住:锁的是访问逻辑,不是变量;粒度要合适——太粗影响并发,太细则易出错;优先用 RAII 类型(lock_guard / scoped_lock),少碰裸 lock()/unlock()


# ai  # c++  # 作用域  # 线程  # 多线程  # 并发  # 死锁  # 加锁  # 多个  # 解锁  # 的是  # 进阶  # 不被  # 用完  # 跳过  # 锁住 


相关文章: 长沙做网站要多少钱,长沙国安网络怎么样?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何在VPS电脑上快速搭建网站?  如何在阿里云域名上完成建站全流程?  如何彻底删除建站之星生成的Banner?  寿县云建站:智能SEO优化与多行业模板快速上线指南  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  建站之星CMS建站配置指南:模板选择与SEO优化技巧  香港服务器选型指南:免备案配置与高效建站方案解析  如何解决VPS建站LNMP环境配置常见问题?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何通过VPS建站无需域名直接访问?  如何正确选择百度移动适配建站域名?  网站制作的步骤包括,正确网址格式怎么写?  建站之星安装步骤有哪些常见问题?  Python如何创建带属性的XML节点  高端网站建设与定制开发一站式解决方案 中企动力  网站微信制作软件,如何制作微信链接?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何快速查询网址的建站时间与历史轨迹?  C++时间戳转换成日期时间的步骤和示例代码  外贸公司网站制作哪家好,maersk船公司官网?  如何通过建站之星自助学习解决操作问题?  制作网站的公司有哪些,做一个公司网站要多少钱?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  广州建站公司哪家好?十大优质服务商推荐  如何选择高性价比服务器搭建个人网站?  建站之星后台管理如何实现高效配置?  做企业网站制作流程,企业网站制作基本流程有哪些?  nginx修改上传文件大小限制的方法  如何选择美橙互联多站合一建站方案?  ,交易猫的商品怎么发布到网站上去?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何通过西部建站助手安装IIS服务器?  魔方云NAT建站如何实现端口转发?  如何选择靠谱的建站公司加盟品牌?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  常州企业网站制作公司,全国继续教育网怎么登录?  如何选择域名并搭建高效网站?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  教学网站制作软件,学习*后期制作的网站有哪些?  黑客如何利用漏洞与弱口令入侵网站服务器?  建站之星好吗?新手能否轻松上手建站?  企业微网站怎么做,公司网站和公众号有什么区别?  如何通过商城免费建站系统源码自定义网站主题?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  孙琪峥织梦建站教程如何优化数据库安全?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  制作销售网站教学视频,销售网站有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。