std::thread用于创建线程执行函数,std::mutex配合std::lock_guard保护共享数据防止竞争,确保多线程程序安全高效运行。
在C++中使用多线程,std::thread 和 std::mutex 是最基础且关键的工具。它们定义在
std::thread 用于启动一个新线程执行函数。你可以传入普通函数、lambda表达式或仿函数(functor)。
示例:
#include#include void say_hello() { std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl; } int main() { std::thread t(say_hello); // 启动线程 t.join(); // 等待线程结束 return 0; }
注意:join() 表示主线程等待子线程执行完毕。如果不调用 join() 或 detach(),程序终止时会调用 std::terminate()。
你也可以传递参数给线程函数:
void print_number(int n) {
std::cout << "Number: " << n << std::endl;
}
std::thread t(print_number, 42);
t.join();
当多个线程访问同一变量时,可能出现数据竞争(data race),导致结果不可预测。使用 std::mutex 可以防止这种情况。
例如,两个线程同时对一个全局计数器加1:
#include#include #include int counter = 0; std::mutex mtx; // 定义互斥锁 void increment() { for (int i = 0; i < 100000; ++i) { mtx.lock(); // 加锁 ++counter; // 安全修改共享数据 mtx.unlock(); // 解锁 } } int main() { std::thread t1(increment); std::thread t2(increment); t1. join(); t2.join(); std::cout << "Final counter value: " << counter << std::endl; return 0; }
上面代码中,每次修改 counter 前都先获取锁,避免两个线程同时写入。
手动调用 lock() 和 unlock() 容易出错,比如忘记解锁或异常导致跳过 unlock。推荐使用 std::lock_guard 实现 RAII(资源获取即初始化)自动管理锁。
改写上面的 increment 函数:
void increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard guard(mtx); // 构造时加锁,析构时自动解锁
++counter;
}
}
即使循环中抛出异常,lock_guard 也会确保释放锁,避免死锁。
基本上就这些。掌握 std::thread 启动线程,配合 std::mutex 和 std::lock_guard 保护共享资源,是C++多线程编程的基础。实际开发中还可结合 std::condition_variable 实现线程通信,但那是进阶内容了。
# 工具
# ai
# c++
# ios
# stream
# 全局变量
# int
# 循环
# Lambda
# 线程
# 多线程
# 主线程
# Thread
# 并发
# 多个
# 死锁
# 解锁
# 加锁
# 进阶
# 也会
# 互斥
# 你可以
# 那是
相关文章:
TestNG的testng.xml配置文件怎么写
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
MySQL查询结果复制到新表的方法(更新、插入)
如何快速搭建高效服务器建站系统?
如何通过虚拟机搭建网站?详细步骤解析
如何登录建站主机?访问步骤全解析
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何在云服务器上快速搭建个人网站?
如何选择靠谱的建站公司加盟品牌?
网站制作软件有哪些,制图软件有哪些?
宝塔新建站点报错如何解决?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
建站主机无法访问?如何排查域名与服务器问题
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何在云指建站中生成FTP站点?
如何选择高效稳定的ISP建站解决方案?
简单实现Android验证码
建站主机服务器选购指南:轻量应用与VPS配置解析
名字制作网站免费,所有小说网站的名字?
如何通过WDCP绑定主域名及创建子域名站点?
如何在万网自助建站中设置域名及备案?
网站制作说明怎么写,简述网页设计的流程并说明原因?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
IOS倒计时设置UIButton标题title的抖动问题
宝塔新建站点为何无法访问?如何排查?
常州企业建站如何选择最佳模板?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何选择高效便捷的WAP商城建站系统?
如何高效完成独享虚拟主机建站?
如何在IIS中新建站点并解决端口绑定冲突?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
南平网站制作公司,2025年南平市事业单位报名时间?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
韩国服务器如何优化跨境访问实现高效连接?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
大同网页,大同瑞慈医院官网?
建站之星安装需要哪些步骤及注意事项?
长沙做网站要多少钱,长沙国安网络怎么样?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
制作门户网站的参考文献在哪,小说网站怎么建立?
做企业网站制作流程,企业网站制作基本流程有哪些?
Android使用GridView实现日历的简单功能
如何高效搭建专业期货交易平台网站?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
制作网站怎么制作,*游戏网站怎么搭建?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何快速重置建站主机并恢复默认配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。