父线程join():在子级完成之前阻止?

皮特

我有一个做一些多线程的C ++类。考虑下面的伪代码:

void MyClass::Open() {
  loop_flag =  true;
  // create consumer_thread (infinite loop)
  // create producer_thread (infinite loop)
}
void MyClass::Close() {
  loop_flag = false;
  // join producer_thread
  // join consumer_thread
}
MyClass::~MyClass() {
  Close();
  // do other stuff here
}

请注意,consumer_thread,producer_thread及其相关函数都封装在MyClass中。调用者不知道他们的调用是多线程的,并且后台发生了什么。

现在,该类是更大程序的一部分。该程序具有一些初始的多线程来处理系统的配置,因为一次发生了很多事情。

像这样(伪代码):

int main() {
  // create config_thread1 (unrelated to MyClass)
  // create thread for MyClass::Open()
  // ...
  // join all spawned configuration threads
}

所以我的问题是,当我为链接到MyClass :: Open()的线程调用join()时(即,在main()中生成的配置线程),会发生什么?它是立即join()(因为MyClass :: Open()函数在创建producer_thread和consumer_thread之后才返回),还是等待producer_thread和consumer_thread完成(因此挂起了我的程序)。

在此先感谢您的帮助。在实现细节方面,我在Linux机器上使用Boost线程。

编辑添加此图:

 main()
 |
 |
 |
 |--->configuration_thread (that runs MyClass::Open())
   |
   |
   |----> producer_thread
   |----> consumer_thread

如果我在configuration_thread()上调用join(),它会等到producer_thread()和Consumer_thread()完成还是立即返回(并且producer_thread()和Consumer_thread()继续运行)?

Didierc

一个(非分离的)线程将是可操纵的,即使从该函数返回设置为运行的线程之后,直到它被加入为止。例子:

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

void foo(){
    std::cout << "helper: I'm done\n";
}

 int main(){

    cout << "starting helper...\n";
    thread helper(foo);

    this::thread::sleep_for(std::chrono::seconds(5));

     cout << "helper still joignable?..." << (helper.joignable()?"yes!":"no...:(") << "\n";

    helper.join();
    cout << "helper joined!";

    cout << "helper still joignable?..." << (helper.joignable()?"really?":"not anymore!") << "\n";

    cout << "done!\n";

}

输出:

starting helper...
helper: I'm done
still joinable?...yes!
helper joined!
still joinable?...not anymore!
done!

至于该join方法需要花费多少时间,我认为这没有指定,但是可以肯定它不必等待所有其他线程完成,否则就意味着只有一个线程可以加入所有其他。

从§30.3.5开始:

void Join();

要求: joinable()true

效果:阻塞直到由代表的线程*this完成。

同步:所代表的线程的完成*this与相应的成功join()返回同步[注意:操作*this不同步。*-尾注*]

[...]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

父线程join():在子级完成之前阻止?

来自分类Dev

阻止父级直到子级关闭

来自分类Dev

当父级在子线程之前退出时,为什么会显示此错误?

来自分类Dev

所有子级完成后,非阻塞方法可启动多个线程并在父线程上运行callabck

来自分类Dev

在C中通知父线程的子级

来自分类Dev

模板渲染顺序:父级在子级模板之前触发

来自分类Dev

Java中的子线程会阻止父线程终止吗?

来自分类Dev

子级任务已取消,父级已完成?

来自分类Dev

如何在关闭父级而不关闭两个父级之前加载子窗体

来自分类Dev

父线程是否在子线程也退出servlet容器之前等待子线程退出?

来自分类Dev

父线程在子线程也退出servlet容器之前是否等待子线程退出?

来自分类Dev

div父级上的preventDefault阻止输入子级获得焦点

来自分类Dev

限制JOIN的父级

来自分类Dev

反应在父级减速器与子级减速器中完成的Redux逻辑

来自分类Dev

在值可用之前,如何防止父级将值传递给子级

来自分类Dev

阻止zsh完成父目录

来自分类Dev

PyQt5 QObject:无法为处于不同线程中的父级创建子级

来自分类Dev

QObject:无法使用QtConcurrent :: run为处于不同线程中的父级创建子级

来自分类Dev

如何在Java中使用AspectJ记录父级和子级的线程ID

来自分类Dev

QFuture无法为处于不同线程中的父级创建子级

来自分类Dev

当所有其他线程在主线程之前完成时,为什么仍然需要.join?

来自分类Dev

在父级之前获取元素

来自分类Dev

如何阻止JavaFX父节点在子级之间拖动后获得点击

来自分类Dev

join()阻止主线程的继续

来自分类Dev

jquery最接近()父级和父级之前

来自分类Dev

阻止iframe重新加载父级

来自分类Dev

QMessageBox在计算时阻止父级

来自分类Dev

如何在将父级的fetch调用中的数据传递给它之前停止React子级组件的加载

来自分类Dev

不清楚为什么在 Angular 初始化之前父级订阅了子级的发射器

Related 相关文章

  1. 1

    父线程join():在子级完成之前阻止?

  2. 2

    阻止父级直到子级关闭

  3. 3

    当父级在子线程之前退出时,为什么会显示此错误?

  4. 4

    所有子级完成后,非阻塞方法可启动多个线程并在父线程上运行callabck

  5. 5

    在C中通知父线程的子级

  6. 6

    模板渲染顺序:父级在子级模板之前触发

  7. 7

    Java中的子线程会阻止父线程终止吗?

  8. 8

    子级任务已取消,父级已完成?

  9. 9

    如何在关闭父级而不关闭两个父级之前加载子窗体

  10. 10

    父线程是否在子线程也退出servlet容器之前等待子线程退出?

  11. 11

    父线程在子线程也退出servlet容器之前是否等待子线程退出?

  12. 12

    div父级上的preventDefault阻止输入子级获得焦点

  13. 13

    限制JOIN的父级

  14. 14

    反应在父级减速器与子级减速器中完成的Redux逻辑

  15. 15

    在值可用之前,如何防止父级将值传递给子级

  16. 16

    阻止zsh完成父目录

  17. 17

    PyQt5 QObject:无法为处于不同线程中的父级创建子级

  18. 18

    QObject:无法使用QtConcurrent :: run为处于不同线程中的父级创建子级

  19. 19

    如何在Java中使用AspectJ记录父级和子级的线程ID

  20. 20

    QFuture无法为处于不同线程中的父级创建子级

  21. 21

    当所有其他线程在主线程之前完成时,为什么仍然需要.join?

  22. 22

    在父级之前获取元素

  23. 23

    如何阻止JavaFX父节点在子级之间拖动后获得点击

  24. 24

    join()阻止主线程的继续

  25. 25

    jquery最接近()父级和父级之前

  26. 26

    阻止iframe重新加载父级

  27. 27

    QMessageBox在计算时阻止父级

  28. 28

    如何在将父级的fetch调用中的数据传递给它之前停止React子级组件的加载

  29. 29

    不清楚为什么在 Angular 初始化之前父级订阅了子级的发射器

热门标签

归档