Как вы можете получить возвращаемое значение потока Windows?
мне просто интересно, возможно ли (и если да, то как) получить возвращаемое значение потока в 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 ответов
GetExitCodeThread - это необходимая функция. Вот описание MSDN того, что он делает:
эта функция немедленно возвращается. Если указанный поток не завершается и функция успешно завершается, возвращается состояние ЕЩЕ АКТИВНЫЙ. Если поток завершен и функция выполнена успешно, возвращаемое состояние является одним из следующих значений:
- значение выхода, указанное в ExitThread или TerminateThread функция.
- возвращаемое значение из функции потока.
- значение выхода процесса потока.
проблема с большинством программистов заключается в том, что они не обращают внимания на предупреждения компилятора. На уровне 4 (/W4) компилятор выдает следующее предупреждение при возврате -1
из функции, которая возвращает DWORD
:
warning C4245: 'return' : conversion from 'int' to 'DWORD', signed/unsigned mismatch
вы можете использовать концепции потоков C++ 11, используя std::future
.
См. пример ниже.
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
}