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

昆明网站建设天锐科技网站开发相关技术

昆明网站建设天锐科技,网站开发相关技术,本地搭建 wordpress,电销网站建设1、背景 在 C 多线程编程中,同步 和 互斥 是至关重要的概念。C 标准库提供了多种同步机制,其中 std::condition_variable_any、std::lock_guard 和 std::unique_lock 是经常被用到的工具。本文将详细介绍这三者的用途、区别、适用场景,并通过…

1、背景

在 C++ 多线程编程中,同步 和 互斥 是至关重要的概念。C++ 标准库提供了多种同步机制,其中 std::condition_variable_any、std::lock_guard 和 std::unique_lock 是经常被用到的工具。本文将详细介绍这三者的用途、区别、适用场景,并通过示例展示如何正确使用它们。

2、std::lock_guard

std::lock_guard 是 C++ 提供的一个 RAII(资源获取即初始化)风格的互斥锁管理器,用于在作用域内 自动管理 std::mutex 的加锁和解锁,确保不会发生死锁或者忘记解锁的问题,它是一种轻量级自动管理锁。

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void print_message(const std::string& msg) {std::lock_guard<std::mutex> lock(mtx); // 自动加锁,作用域结束时自动解锁std::cout << msg << std::endl;
}int main() {std::thread t1(print_message, "Hello from thread 1");std::thread t2(print_message, "Hello from thread 2");t1.join();t2.join();return 0;
}

该锁主要适用于短生命周期的互斥操作。

3、std::unique_lock

与std::lock_guard相比,std::unique_lock支持更加灵活的互斥锁管理。主要有以下几个功能:

  • 支持 defer_lock(延迟加锁),允许在稍后手动调用 lock();
  • 支持手动 unlock(),适用于更复杂的同步场景。
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void worker() {std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 不自动加锁std::cout << "Before locking...\n";lock.lock(); // 需要时手动加锁std::cout << "Worker thread acquired lock\n";lock.unlock(); // 需要时手动解锁std::cout << "Worker thread released lock\n";
}int main() {std::thread t(worker);t.join();return 0;
}
  • 支持 try_lock,尝试加锁但不阻塞;
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>std::mutex mtx;void worker() {std::unique_lock<std::mutex> lock(mtx, std::try_to_lock); // 尝试加锁if (lock.owns_lock()) { // 判断是否成功加锁std::cout << "Worker acquired lock\n";} else {std::cout << "Worker failed to acquire lock\n";}
}int main() {std::unique_lock<std::mutex> main_lock(mtx); // 先加锁,让 worker 线程无法获取锁std::thread t(worker);std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 模拟主线程持锁一段时间main_lock.unlock(); // 释放锁t.join();return 0;
}
  • 支持 timed_lock,尝试在一定时间内加锁;
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>std::mutex mtx;void worker() {std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 延迟加锁if (lock.try_lock_for(std::chrono::seconds(2))) { // 等待最多2秒尝试加锁std::cout << "Worker acquired lock\n";} else {std::cout << "Worker failed to acquire lock within timeout\n";}
}int main() {std::unique_lock<std::mutex> main_lock(mtx); // 先加锁std::thread t(worker);std::this_thread::sleep_for(std::chrono::seconds(3)); // 持锁超过 worker 的等待时间main_lock.unlock(); // 释放锁t.join();return 0;
}

4、std::condition_variable_any

std::condition_variable 只能和 std::unique_lockstd::mutex 结合使用,但是 std::condition_variable_any 可以适配 std::shared_mutex,从而实现 读写者模型。

#include <iostream>
#include <thread>
#include <shared_mutex>
#include <condition_variable>std::shared_mutex rw_mutex;
std::condition_variable_any cv;
bool data_ready = false;
int data = 0;// 读线程(多个线程可以共享读取)
void reader(int id) {std::shared_lock<std::shared_mutex> lock(rw_mutex);cv.wait(lock, [] { return data_ready; }); // 等待数据就绪std::cout << "Reader " << id << " read data: " << data << std::endl;
}// 写线程(独占写入)
void writer() {std::this_thread::sleep_for(std::chrono::seconds(2));{std::unique_lock<std::shared_mutex> lock(rw_mutex);data = 42;data_ready = true;}cv.notify_all(); // 唤醒所有等待的读线程
}int main() {std::thread readers[3] = {std::thread(reader, 1),std::thread(reader, 2),std::thread(reader, 3)};std::thread writer_thread(writer);for (auto& r : readers) r.join();writer_thread.join();return 0;
}
  • std::condition_variable_any 与 std::condition_variable 的区别
特性std::condition_variablestd::condition_variable_any
兼容锁类型只能配合std::unique_lock<std::mutx>兼容所有符合Lockable规范的锁如std::unique_lock<std::shared_mutex>
适用范围只能用于std::mutex适用于std::mutex、std::shared_mutex等
适用场景经典生产者-消费者模型适用于读写锁等更多场景
线程等待允许多个线程等待同一条件允许多个线程等待同一条件

5、结论

  • 如果你只需要在作用域内加锁并确保自动释放,使用 std::lock_guard。
  • 如果你需要更灵活的锁管理,如手动解锁或尝试加锁,使用 std::unique_lock。
  • 如果你需要线程间的条件同步,使用 std::condition_variable_any或者std::condition_variable,再根据std::mutex和std::shared_mutex哪个可以满足需求决定使用那一个条件变量,std::condition_variable_any比std::condition_variable功能更加强大,因此它的性能开销应该比std::condition_variable更大,因此如果std::condition_variable可以满足需要,最好使用std::condition_variable,否则使用std::condition_variable_any。

文章转载自:

http://AnUwyUbV.mknxd.cn
http://GzquMtOq.mknxd.cn
http://rKIcux5y.mknxd.cn
http://Kg4eQExQ.mknxd.cn
http://XJBDF5wT.mknxd.cn
http://QTUwUAkn.mknxd.cn
http://cHgnfh7P.mknxd.cn
http://vTqnlQmX.mknxd.cn
http://AFPgxPds.mknxd.cn
http://QAUMRNQL.mknxd.cn
http://yoXC0EQg.mknxd.cn
http://0Z70Ulnx.mknxd.cn
http://q64vyebL.mknxd.cn
http://MqRcvhtN.mknxd.cn
http://HnzR8LjW.mknxd.cn
http://HZbfDX1J.mknxd.cn
http://e0LS4pnB.mknxd.cn
http://tIooLycu.mknxd.cn
http://n8CZIiKb.mknxd.cn
http://tDdIAe6p.mknxd.cn
http://zMXbLiiL.mknxd.cn
http://6EhW17SI.mknxd.cn
http://zoSqdRyL.mknxd.cn
http://kkSgyN22.mknxd.cn
http://Wb5vAKbp.mknxd.cn
http://H7GbnUml.mknxd.cn
http://IHaKQeDa.mknxd.cn
http://sjrjusZC.mknxd.cn
http://qNbpEVkm.mknxd.cn
http://VYhSSG3a.mknxd.cn
http://www.dtcms.com/wzjs/742949.html

相关文章:

  • 手机网站开发技术pdf免费的企业品牌策划公司
  • 网站建设实训报告样板手机网站设计机构
  • 怎么样建设一个网站网上下载的html模板怎么修改
  • 杭州市做网站手机网站建设哪家强
  • 秦皇岛网站建设哪家好设计师培训学校有哪些
  • .简述网站开发的流程cdr 做网站
  • 金融街做网站的公司小学托管班
  • 上海百度百科seo标题生成器
  • 广州网络科技有限公司有哪些广州网站建设网站优化推广
  • 怎么做地方门户网站水处理网站模板
  • 网站建设网络公关溧阳网站建设中心
  • 网站流量达到多少企业网站做多大
  • 一起做网站17杭州女装湖北阳新县建设局网站
  • 国外做连接器平台网站南宁网站制作系统
  • 做搜狗pc网站优化快速外贸网站 海外推广
  • 超级seo工具搜索网站排名优化策略
  • 判断电脑和手机访问网站深圳工程建设交易服务中心网站
  • 手机号码网站开发百度怎么推广自己的产品
  • 网站的维护和更新网站建设需要的专业知识
  • 椒江建设网保障性阳光工程网站工作组赴沈阳爆炸现场
  • 成都旅游酒店推荐台州首页关键词优化
  • 坪山网站建设哪家效益快wordpress调用分类
  • 开一个做网站的公司赚钱吗云服务器有哪些
  • asp网站模板安装教程wordpress自动发外链
  • 办公室装修企业东莞优化公司首选3火星
  • 上海明鹏建设集团有限公司网站网站商务方案
  • 用vs2013做网站教程游戏开发者大会
  • 秦皇岛和平大街网站建设域名网站负责人的责任
  • 用织梦做企业网站wordpress exp
  • wordpress本地建站中国营销网站