Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >主线程在阻塞线程上运行吗?

主线程在阻塞线程上运行吗?
EN

Stack Overflow用户
提问于 2017-03-30 04:37:18
回答 1查看 1.6K关注 0票数 2

当我开始研究c++11中的线程时,我认为.join()用于对主线程进行阻塞操作,而std::async()用于运行非阻塞线程。

在我看来,这个答案很好地解释了std:async()https://stackoverflow.com/a/15035157/1770034

但我想更好地理解连接方法。我发现了几个类似的例子:https://stackoverflow.com/a/11229853/1770034,其中只有一个线程是从主线程创建的。

然后我找到了这个https://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

来自站点的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <thread>

static const int num_threads = 10;

//This function will be called from a thread

void call_from_thread(int tid) {
    std::cout << "Launched by thread " << tid << std::endl;
}

int main() {
    std::thread t[num_threads];

    //Launch a group of threads
    for (int i = 0; i < num_threads; ++i) {
        t[i] = std::thread(call_from_thread, i);
    }

    std::cout << "Launched from the main\n";

    //Join the threads with the main thread
    for (int i = 0; i < num_threads; ++i) {
        t[i].join();
    }

    return 0;
}

我对此很好奇这部分就在这里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Join the threads with the main thread
for (int i = 0; i < num_threads; ++i) {
    t[i].join();
}

如果主线程停止等待直到.join()完成,那么循环如何运行以连接更多的线程?它工作的事实是伟大的!但是,为什么会起作用呢?

它为什么会这样工作?这是我对它是如何工作的印象。

  1. 主螺纹连接第一螺纹。
  2. 主线程等待到第一个线程完成。
  3. 第一线程完成。
  4. 主线程继续在for循环和连接第二线程。
  5. 主线程等待直到第二个线程完成。
  6. ...

如果它一直循环通过for循环,主线程什么时候才会被阻塞等待?

编辑

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Join the threads with the main thread
for (int i = 0; i < num_threads; ++i) {
    t[i].join();
    // --- Perform some long operation here ---
}

长时间的手术什么时候开始?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-30 12:57:58

当我贴出这个问题时,我不太明白多线程是怎么回事。

即使在C++中阅读有关主题的几篇教程时,它仍然会有点模糊。这是对实际发生的事情的解释。

为了保持简单,让我们使用以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <thread>

void my_function()
{
     *** Some Code ***
}

int main()
{
    std::thread threads[10]; //create 10 std::thread objects

    for(int loop = 0; loop < 10; loop++)
    {
        threads[loop] = std::thread(my_function);
    }

    //Threads are executing on machine and main code is also running

    for(int loop = 0; loop < 10; loop++)
    {
        threads[loop].join; //If threads[loop] is still running wait for it, otherwise keep moving forward.
    }

    return 0;
} //all 10 thread objects (threads) are going out of scope and their destructors are being called

在main的顶部(在主线程中),我们为堆栈上的10个线程对象创建空间。在第一个for循环中,我们实际上创建了一个std::thread,它将在一个单独的线程上调用my_function

假设我们有一个四核处理器,并且一次只能在一个处理器上运行一个线程。(完全是假设!)主线程目前正在使用一个处理器,我们的10个线程中的一个将使用第二个处理器。其余9人中有1人将使用第3人,其余8人中有1人将使用第4人。

for循环之间,我们可以在主线程上执行我们想要的所有代码。(主线程没有阻塞)。接下来是第二个for循环。这个循环将遍历并告诉每个线程到join

让我们假设线程1-9在这个时间点之前已经执行了,但是我们仍然在后台运行线程10。当for循环加入线程1时,由于它已经完成,for循环再次运行。这种情况继续在前9个线程中发生。现在我们join线程10,它仍然在运行,主线程现在将等待线程10完成。(如果您需要在某一时刻完成代码才能继续前进,这是很好的。)

接下来,我们有我们创建的return 0;std::thread,超出了作用域,因为它们是对象,所以调用析构函数。因为所有的线程都连接到主线程,所以不会抛出异常,所有的事情都会很好地结束。

如果我们想,“嘿,我不在乎线程是否完成,这个程序就结束了。”当调用std::thread析构函数时,std::thread对象会注意到有问题,并引发std::terminate

如果我们真的不在乎线程何时完成或者线程是否完成。我们可以使用detach。这将允许它在完成任务之前运行。如果它仍然运行在main的末尾,那么线程就会毫无例外地死掉(一个现代的操作系统会用这个进程杀死它)。

什么是joinable?如果您没有从调用方(本例中的主线程)将线程指向或detach线程,则joinable将为真。如果您想检查线程是否仍在运行,而不是join,直到线程运行。您将需要使用std::async代替。(Can C++11 tell if std::thread is active?)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43118107

复制
相关文章
使用阻塞队列实现线程同步_线程可以并行执行吗
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170824.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
5060
使用阻塞队列实现线程同步_线程可以并行执行吗
服务器模型——从单线程阻塞到多线程非阻塞(上)
前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。阻塞I/O在做I/O读写操作时会使当前线程进入阻塞状态,而非阻塞I/O则不进入阻塞状
企鹅号小编
2018/02/01
1.5K0
服务器模型——从单线程阻塞到多线程非阻塞(上)
Java线程阻塞
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。
全栈程序员站长
2021/05/19
1.1K0
Python多线程、阻塞线程、线程同步和守护线程实例详解
1、主线程是程序本身,看不到的,主线程和子线程没有依赖关系,同步执行的,若主线程先执行完,会等子线程执行完毕,程序结束
王大力测试进阶之路
2020/02/10
4.8K0
线程池阻塞问题
几天生产环境有同事反映分页查询一直在转圈查不出来数据,跟我反馈,我也是很积极的去看有什么问题,我以为就是比较常见的问题吧,当我看的时候觉得很奇怪。
青衫染红尘
2023/02/28
5100
java 线程阻塞的问题
中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。结合:使用Thread.interrupt()中断线程
田春峰-JCJC错别字检测
2019/02/14
9770
多线程之阻塞队列
DelayQueue每次都是将元素加入排序队列,以delay/过期时间为排序因素,将快过期的元素放在队首,取数据的时候每次都是先取快过期的元素。 构造方法
OPice
2019/10/23
8770
线程的阻塞和唤醒
park方法有两个参数来控制休眠多长时间,第一个参数isAbsolute表示第二个参数是绝对时间还是相对时间,单位是毫秒。
春哥大魔王
2019/08/14
1.6K0
02.线程阻塞状态/线程控制
02.线程阻塞状态/线程控制 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻塞的主要方法。 1.join() join —— 让一个线程
Java帮帮
2018/03/15
1.1K0
02.线程阻塞状态/线程控制
OB 运维 | OceanBase 是如何关闭主备线程的?
爱可生南区交付服务部 DBA 团队成员,主要负责 MySQL 故障处理,MySQL 高可用架构改造,OceanBase 相关技术支持。爱好足球,羽毛球。
爱可生开源社区
2023/08/18
2090
OB 运维 | OceanBase 是如何关闭主备线程的?
MySQL 5.7 线程阻塞处理
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
星哥玩云
2022/08/16
5720
阻塞队列中的线程协作(阻塞、唤醒、锁)
阻塞队列,主要操作有两个,一个是put放入元素,另一个是take取出元素。所谓的阻塞就是当多个线程同时存取数据时,如果遇到队列为空或者队列为满时,会发生阻塞。并且多个线程同时执行take或者put操作时,某一时刻只有一个线程获得执行权利,也就是执行任何一个操作之前需要获得锁,没有获得锁的线程发生阻塞。
naget
2019/07/30
1.2K0
支持生产阻塞的线程池
在各种并发编程模型中,生产者-消费者模式大概是最常用的了。在实际工作中,对于生产消费的速度,通常需要做一下权衡。通常来说,生产任务的速度要大于消费的速度。一个细节问题是,队列长度,以及如何匹配生产和消费的速度。
哲洛不闹
2018/09/19
7590
支持生产阻塞的线程池
支持生产阻塞的线程池
我们使用线程池的时候,经常使用默认的丢弃策略,那么我们也可以自定义策略,那么下面的文章可以看下。
小程故事多
2018/08/22
4530
支持生产阻塞的线程池
【译】在正确的线程上观察
尽管很多人了解RxJava的基本逻辑,但是在Observable链和操作符究竟运行在哪个线程,仍然会有许多困惑。
用户1740424
2018/07/23
5150
【译】在正确的线程上观察
Android多线程编程__阻塞队列
我们可以看到,ArrayBockingQueue 维护了一个 Object 类型的数组,takeIndex 和 putIndex 分别表示队首元素和队尾元素的下标,count表示队列中元素的个数,接着往下看
Petterp
2022/02/09
1K0
Android多线程编程__阻塞队列
最全服务器模型详解——从单线程阻塞到多线程非阻塞
前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。阻塞I/O在做I/O读写操作时会使当前线程进入阻塞状态,而非阻塞I/O则
小小科
2018/05/03
2.8K0
最全服务器模型详解——从单线程阻塞到多线程非阻塞
Java多线程 (Part3: 线程、进程原理、阻塞队列)
通过 Override Thread类中的start方法,不断循环调用传递过来的Runnable对象
JiahuiZhu1998
2023/06/16
2170
【JavaEE初阶】多线程(四)阻塞队列 定时器 线程池
阻塞队列是一种特殊的队列. 也遵守 “先进先出” 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性:
xxxflower
2023/04/27
2970
【JavaEE初阶】多线程(四)阻塞队列 定时器 线程池
Class.forName 造成的线程阻塞
今天在查看服务器时,发现机器上稳定的会有 3 ~ 4 个线程处于阻塞状态,感觉应该是有问题的,仔细排查了一下,最终发现和 Class.forName 有关。
健程之道
2021/01/05
1.2K0

相似问题

RunWorkerCompleted没有在主UI线程中执行吗?

14

单独线程无法运行,阻塞主UI

20

TableView scrollToRow阻塞了主ui线程

40

Thread.sleep()阻塞主UI线程

32

在Logger上阻塞Java线程

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文