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