【问题标题】:How can you get the return value of a Windows thread?如何获取 Windows 线程的返回值?
【发布时间】:2011-10-29 08:24:17
【问题描述】:

我只是想知道是否有可能(如果有,如何)在 C++ (Windows) 中获取线程的返回值。我有几个线程,我在它们上使用WaitForMultipleObjects(...)。这会等到一个线程完成,并返回所述线程的索引,一切都很好。但是,我希望能够获得使用完其句柄的线程的返回值。

例如:

DWORD WINAPI Thread1(void *parameter){
    ...
    if(...) return 0;
    else return -1;
}

DWORD WINAPI Thread2(void *parameter){
    ...
    if(...) return 1;
    else return 0;
}

int main(){
    HANDLE t1 = CreateThread(0, 0, Thread1, NULL, 0, 0);
    HANDLE t2 = CreateThread(0, 0, Thread2, NULL, 0, 0);
    HANDLE *threads = new HANDLE[2];
    threads[0] = t1;
    threads[1] = t2;
    int result = WaitForMultipleObjects(2, threads, false, INFINITE);
    if(result == 0){
        //get the threads value here:
        int retVal = SomeFunction(t1); //What is SomeFunction?
    }
    ...
}

我曾尝试使用GetExitCodeThread(thread),但我假设这会返回一个系统退出代码,因为它总是给我一个非常奇怪的整数。有人知道方法或解决方法吗?

【问题讨论】:

  • 我一直使用GetExitCodeThread。你确定你使用正确吗?它接受一个线程句柄和一个指向 DWORD 的指针,并返回 GetExitCodeThread 的成功(不是线程的返回值)。
  • 你的问题就是我的答案:)

标签: c++ windows multithreading winapi return-value


【解决方案1】:

您需要检查 STILL_ACTIVE 以了解这些线程之一可能仍处于活动状态的值

【讨论】:

    【解决方案2】:

    GetExitCodeThread 是正确的函数。以下是 MSDN 对其功能的描述:

    此函数立即返回。如果指定的线程还没有 终止并且函数成功,返回的状态是 STILL_ACTIVE。如果线程已经终止并且函数成功, 返回的状态是以下值之一:

    • ExitThread 或 TerminateThread 函数中指定的退出值。
    • 线程函数的返回值。
    • 线程进程的退出值。

    【讨论】:

    • GetExitCodeThread(t1, &retVal) 并返回 4294967295(retVal 是一个 DWORD)。线程中的实际返回值为-1。我刚刚发现整数反弹为负数。叹息……
    【解决方案3】:

    大多数程序员的问题是他们不注意编译器警告。在级别 4 (/W4),当从返回 DWORD 的函数返回 -1 时,编译器会产生以下警告:

    warning C4245: 'return' : conversion from 'int' to 'DWORD', signed/unsigned mismatch

    【讨论】:

      【解决方案4】:

      您可以通过 std::future 使用 C++ 11 的线程概念。
      请参阅下面的示例。

      int ReturnFrmThread() {
          return 100;
      }
      
      int main() {
          std::future<int> GetRetVal= std::async(ReturnFrmThread);  // Execution of ReturnFrmThread starts
          int answer = GetAnAnswer.get(); // gets value as 100; 
          // Waits until ReturnFrmThread has finished
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 2011-10-17
        • 2018-04-15
        相关资源
        最近更新 更多