如何获得Windows线程的返回值?

如何获得Windows线程的返回值?

问题描述:

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

例如:

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)但我假定这将返回系统退出代码,因为它总是给我一种很奇怪的整数。有谁知道一种方式,或解决方法?

+3

我一直使用GetExitCodeThread。你确定你使用正确吗?它需要一个线程句柄和一个指向DWORD的指针,并返回GetExitCodeThread的成功(不是线程的返回值)。 –

+0

你的问题是我的回答:) – Koying

GetExitCodeThread是正确的函数。这里是MSDN的描述:

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

  • 在了ExitThread或TerminateThread函数指定的退出值。
  • 线程函数的返回值。
  • 线程进程的退出值。
+2

'GetExitCodeThread(t1,&retVal)'并返回4294967295(retVal是一个DWORD)。线程中的实际返回值是-1。我刚刚发现整数反弹到负值。叹... – Sefu

你需要检查STILL_ACTIVE的价值观,这些线程之一可能还是活跃

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

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

可以使用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 
}