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

时间:2011-08-17 22:47:53

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

我只是想知道是否有可能(如果是这样,如何)在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),但我假设这会返回系统退出代码,因为它总是给我一个非常奇怪的整数。有没有人知道某种方法或解决方法?

4 个答案:

答案 0 :(得分:11)

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

  

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

您需要检查STILL_ACTIVE以查找其中一个线程可能仍处于活动状态的值

答案 3 :(得分:1)

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