C++多线程join同步问题
2024-10-18 18:25:15
其实就是想记录一下自己的想法,就是关于多个线程的执行顺序的思考。之前一直觉得std::thread::join会阻塞其他线程的运行,其实并不是这样子的。举个例子
std::vector<std::thread *>lt; for(int i = 35 ; i >20 ; i--)
{
std::thread *t= new thread(show,std::to_string(i)+"ccccc");
lt.emplace_back(t);
} for(auto &it:lt)
{
it->join();
}
想想看,上面这个例子,它运行起来之后是啥状态,不管show函数做了啥,可以看到有15个线程会被创建,然后放到lt这个容器里面,然后逐个被join,然后主线程
在这个位置被阻塞。但是思考一下,逐个进行join的话,第一个join执行的时候,如果第一个线程没有执行完,那么,就直接阻塞在这里来。换句话说,即使后面的线程
还没有被执行join函数,但是也相当于是对主线程进行了阻塞。然后当后面线程执行完之后才可能被执行join函数。所以这样写是同步的。
但是如果是这样子呢。
std::vector<std::thread *>lt; for(int i = 35 ; i >20 ; i--)
{
std::thread *t= new thread(show,std::to_string(i)+"ccccc");
t->join();
lt.emplace_back(t);
}
这样子应该是顺序执行了吧,我测试的结果是可能后面都没有开起来多的线程,而是优化成了顺序执行。根本没有并行执行
最新文章
- python enumerate 用法
- 使用 Device Mapper来改变Docker容器的大小
- 极简Word排版示例(以Word2013为例)
- mysql 查询优化规则
- 团队开发——冲刺1.c
- genymotion虚拟机启动失败
- 禁止用户自己停止SEP - 飞舞的菜刀 - 51CTO技术博客
- css定义的权重
- .NET Core 1.0.0 RC2
- tcp异常终止连接
- IIS 和 各个协议
- 不依赖浏览器控制台的JavaScript断点调试方法
- IIC-BUS INTERFACE
- spring配置文件一般结构
- MacBook 经常使用快捷键
- TCP/IP,Web世界的基本规则
- 了解unix操作系统发展阶段
- ue4网络同步概念笔记
- 安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息
- [AWS] OAuth2.0