如何获得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)
但我假定这将返回系统退出代码,因为它总是给我一种很奇怪的整数。有谁知道一种方式,或解决方法?
GetExitCodeThread是正确的函数。这里是MSDN的描述:
该函数立即返回。如果指定的线程没有终止并且功能成功,则返回的状态为 STILL_ACTIVE。如果该线程已终止和函数成功, 返回的状态是以下值之一:
- 在了ExitThread或TerminateThread函数指定的退出值。
- 线程函数的返回值。
- 线程进程的退出值。
'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
}
我一直使用GetExitCodeThread。你确定你使用正确吗?它需要一个线程句柄和一个指向DWORD的指针,并返回GetExitCodeThread的成功(不是线程的返回值)。 –
你的问题是我的回答:) – Koying