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

网站开发可以自学吗网站收录免费咨询

网站开发可以自学吗,网站收录免费咨询,网站搭建设计是什么意思,保定网站建目录 从第一性原理出发:为什么需要线程? ✅ 本质定义: 📌 使用基本语法: 线程之间的“并发”与“并行”的区别 线程安全与数据竞争(Race Condition) 如何让线程“安全地”访问数据&#x…

目录

从第一性原理出发:为什么需要线程?

 ✅ 本质定义:

📌 使用基本语法:  

线程之间的“并发”与“并行”的区别

 线程安全与数据竞争(Race Condition)

如何让线程“安全地”访问数据? 

完整示例:使用线程加速加法 


从第一性原理出发:为什么需要线程?

想象一下:

你有一个程序,它要做很多事,比如:

  • 下载文件

  • 处理图片

  • 打印日志

  • 响应用户输入如果这些任务按顺序来(单线程),那用户体验就会很差:比如下载还没完,界面就卡住了。

第一性问题来了: 

能不能让程序同时做多件事,而不是排队一个个来? 

 能!用线程! 

 ✅ 本质定义:

 线程(Thread)是程序内部能并发执行的最小单位。

线程 = 程序里可以独立并发执行的一段任务。 

一个程序至少有一个线程(主线程),你可以再创建多个线程来同时执行不同的代码块。

📌 使用基本语法:  

#include <thread>

 std::thread 类就是 C++ 提供的“创建和管理线程”的工具。

#include <iostream>
#include <thread>void work() {std::cout << "工作线程正在运行\n";
}int main() {std::thread t(work);  // 创建一个线程执行 work()t.join();             // 等待这个线程执行完std::cout << "主线程结束\n";
}

解释:

  • std::thread t(work);:创建了一个“工人线程”,去执行函数 work

  • t.join();:告诉主线程“等工人做完再走”

  • 最后主线程输出“主线程结束”

创建线程的三种方式:

方法示例
传函数名(函数指针)std::thread t(func);
传 lambda 表达式std::thread t([](){ ... });
传函数对象(仿函数)std::thread t(Functor());

 线程的控制操作(joindetach

std::thread t(func);

你创建了一个新线程,但它和主线程是“并行运行的”。

 接下来你必须做一件事(二选一):

操作说明
t.join()等待这个线程运行结束,和主线程“合并”
t.detach()把线程“放飞”,让它自己跑,主线程不再管它(后台线程)

C++ 标准要求:每个 std::thread 对象 在销毁前必须被 join 或 detach! 

注意:主线程可能在子线程还没结束时就退出了,这种线程叫做 后台线程。 

线程之间的“并发”与“并行”的区别

概念含义
并发(concurrent)逻辑上“同时”运行,实际上轮流交替执行(单核CPU)
并行(parallel)真正的同时执行(多核CPU,每个线程跑在不同核上)

 线程安全与数据竞争(Race Condition)

多个线程访问同一块数据会出问题! 

int counter = 0;void add() {for (int i = 0; i < 100000; ++i)++counter;
}int main() {std::thread t1(add);std::thread t2(add);t1.join();t2.join();std::cout << counter << std::endl;  // ❓ 输出不是 200000?!
}

为什么?

  • 因为两个线程在同时修改同一个变量

  • 出现了所谓的 数据竞争(Race Condition)

如何让线程“安全地”访问数据? 

使用互斥锁(std::mutex) 

#include <mutex>std::mutex mtx;void add() {for (int i = 0; i < 100000; ++i) {std::lock_guard<std::mutex> lock(mtx);  // 自动加锁/解锁++counter;}
}

 使用 lock_guard 是现代 C++ 推荐的做法,RAII 自动释放锁

完整示例:使用线程加速加法 

#include <iostream>
#include <thread>void printRange(int start, int end) {for (int i = start; i <= end; ++i)std::cout << i << " ";
}int main() {std::thread t1(printRange, 1, 50);std::thread t2(printRange, 51, 100);t1.join();t2.join();std::cout << "\nDone\n";
}

 输出可能是:

1 2 3 51 52 53 ... 50 100

顺序是“乱的”!因为是并发执行的结果。 

http://www.dtcms.com/wzjs/327442.html

相关文章:

  • 网站建设费用是什么科目百度相册登录入口
  • 阿里云能放企业网站吗seo技术公司
  • 广东手机网站建设价格低网络软文是什么意思
  • 九龙坡网站建设兴安盟新百度县seo快速排名
  • 便宜网站制作百度指数数据分析
  • win10 网站建设软件竞价托管公司排名
  • wordpress主题上传专业网站seo推广
  • 高端的咨询行业网站策划百度怎么优化关键词排名
  • 免费公司网站主页模板河南疫情最新消息
  • java如何做网站的教程广州搜索seo网站优化
  • 域名邮箱如何注册推广优化网站排名
  • 东莞政府网站建设seo的含义是什么意思
  • 网站建设贰金手指下拉贰壹搜索引擎优化的技巧
  • 网站建设与维护工作西安网站推广
  • wordpress做双语网站淘词神器
  • 香港永久网站外链发布的平台最好是
  • 关于自行建设门户网站的请示seo1域名查询
  • 关于网站备案的44个问题模板建站哪个平台好
  • 丽水网站开发海外推广营销 平台
  • 青岛 机械 中企动力提供网站建设广州网站定制多少钱
  • 纳森网络做网站多少钱搜索引擎市场份额2023
  • 郑州网站建设价位seo网站推广软件 快排
  • 地产网站建设互动营销铜川网络推广
  • wordpress上传网上打不开seo整站优化哪家好
  • 动态html做网站背景全媒体运营师培训
  • 滕州网站制作新站如何让百度快速收录
  • 哪个网站能找到做夜场的女孩seo优化与推广招聘
  • 微信公众号接口文档快速seo优化
  • 网站解析需要什么公司企业网站制作需要多少钱
  • 上海高档网站建设什么公司适合做seo优化