【问题标题】:C++ observing the end of main() in another threadC++ 在另一个线程中观察 main() 的结尾
【发布时间】:2014-05-26 22:32:00
【问题描述】:

我希望能够在 C++ 中的进程终止之前捕获主函数的结尾并在另一个线程中执行其他操作。

我一直在尝试获取主线程的句柄,然后加入它,但似乎 std::this_thread/boost::this_thread 不允许您访问当前线程的句柄。

我想做的基本上如下:

void thread_function(thread_handler) {
  thread_handler.join();
  < Perform extra operations before the program finishes its main function >
}

int main() {
  < thread_function thread started in LD_PRELOAD>

  ....  Program runs .....
  return 0;
}

在我的场景中,这两个函数没有共享状态,因为 thread_function 线程是在共享库中使用 LD_PRELOAD 调用的,但我可以将稍后调用 main() 的线程中的任何内容传递给它。很可能无法捕捉到 main 函数的结尾,但我想如果有人知道这一点,我会问一下。

【问题讨论】:

  • 为什么不只拥有一个带有析构函数的全局对象?
  • 你考虑过::atexitstd::at_quick_exit吗?
  • @KerrekSB 这不一样。许多本身使用全局静态的库不能在 main 之外使用(静态初始化惨败)。所以 global 与 main 不同(看起来它确实对于 OP 的场景来说已经足够了)
  • @Chnossos 非常感谢!这正是我所需要的,即使在调用 main 函数之前设置它似乎也可以工作。
  • 嗯,它与你的 main() 函数实际上并没有什么不同,它负责确保线程在退出之前退出。只是一种混淆问题的方法,您只希望 ::atexit() 函数以正确的顺序运行。顺序非常很重要。

标签: c++ multithreading c++11 boost ld-preload


【解决方案1】:

听起来你需要一个信号量,毕竟,你需要防止程序关闭,直到所有线程都完成了它们在程序退出时需要做的任何事情。

因此,您需要主线程发出它正在停止的信号,然后等待其他线程(如果有多个线程)完成并报告它们已完成。最简单的方法是设置一个事件来通知其他线程,然后等到每个线程都发出信号量设置为您要等待的线程。

Kennel 对象可以满足这一点,它们可以跨进程工作,因此它们可以跨共享库工作。

【讨论】:

  • 条件变量 + std::thread::join() 更合适,因为它们实际上是语言的一部分。
  • 你怎么看? “我可以从稍后调用 main() 的线程中传递任何东西。” 他不需要主线程的句柄来将条件变量的引用从调用main的线程...
  • 所以你想说的是传递对在 main 中启动的线程的引用作为对要加入的线程本身的引用?你为什么不发布一个解释你的意思的答案,而不是对我的一个神秘的评论。
  • 不,我的意思是传递对条件变量的引用,如果需要传递对条件变量的引用——您希望如何使用信号量?这一点也不神秘。我对您的回答发表评论的原因是因为我回应了当条件变量在语言中而信号量不是时使用信号量的建议。
  • 仍然发布解释它的答案。我以前没有听说过 C++ 中的条件变量(显然是 C++11 的新手)。毫无疑问,OP 也没有。
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2013-07-12
  • 1970-01-01
  • 2022-08-19
  • 2011-03-25
相关资源
最近更新 更多