【问题标题】:Is it possible to return an exit code from a thread in C++?是否可以从 C++ 中的线程返回退出代码?
【发布时间】:2020-12-07 02:31:47
【问题描述】:

我正在学习 C++,目前正在开发一个具有两个并发线程的程序。在 Visual Studio 的调试窗口中,它总是告诉我:

线程 x 以代码 0 (0x0) 退出。

我想从我的线程返回一个退出代码,以便 Visual Studio 可以在控制台中显示退出代码,就像它对这些其他线程所做的那样。我已经对其进行了测试,仅从线程函数返回 int 并不会改变 Visual Studio 的输出。它仍然说有问题的线程以代码 0 退出。

我也用谷歌搜索了它,但我找不到任何关于如何做到这一点的信息(至少不是thread.h)。 如果不可能,这没什么大不了的,因为我总是可以从线程返回一个值并将其镜像到进程退出代码中,但是如果不可能,那么我看到的退出代码是什么在调试窗口中?

【问题讨论】:

  • 不,在标准 C++ 中没有类似的东西。 C++ 库有一个单独的 promise/future 模板对象,您可以使用它来实现此功能。
  • @SamVarshavchik 我不知道 StackOverflow 是如何工作的,但你是关闭这篇文章的人吗?因为我的问题是专门关于返回退出代码的,而不仅仅是一般的返回值。另外,我仍在等待帖子中最后一个问题的答案,这与链接的帖子无关。我认为这篇文章不应该被关闭,你能打开它吗?
  • void ExitThread(DWORD dwExitCode);首先阅读文档! docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/…
  • Windows 不是唯一的平台。例如,在 Linux 中,没有线程退出代码之类的东西。这就是标准没有线程退出代码概念的原因。 std::thread 可以调用void 函数,当你的函数返回除void 之外的任何内容时,返回值被简单地丢弃。
  • @Evg 虽然在Linux中线程没有“退出代码”是正确的,但线程的返回值是void*,而不是可以用来表示和退出代码。

标签: c++ multithreading


【解决方案1】:

您需要使用特定于平台的线程而不是 std::thread

在 Windows 中,您将使用 CreateThread。在 Visual Studio 中有_beginthread_beginthreadex(只使用后者,不推荐使用_beginthead),应该使用它们来代替CreateThread,尽管目前没有太大区别。使用这些函数时,您只需从线程函数返回退出代码。或者,致电ExitThread_endthreadex。但这可能不安全,因为它不会执行任何后续代码,包括当前范围内对象的析构函数。

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2013-09-24
    相关资源
    最近更新 更多