Как вы можете получить возвращаемое значение потока 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


вам нужно проверить STILL_ACTIVE для значений, один из этих потоков все еще может быть активным


вы можете использовать концепции потоков 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
}