Как вы можете получить возвращаемое значение потока Windows? - PullRequest
7 голосов
/ 18 августа 2011

Мне просто интересно, возможно ли (и если да, то как) получить возвращаемое значение потока в 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 ]

11 голосов
/ 18 августа 2011

GetExitCodeThread - правильная функция. Вот MSDN описание того, что он делает:

Эта функция немедленно возвращается. Если указанный поток не имеет завершается и функция завершается успешно, возвращается статус STILL_ACTIVE. Если поток завершен, и функция завершается успешно, возвращаемое состояние имеет одно из следующих значений:

  • Значение выхода, указанное в функциях ExitThread или TerminateThread.
  • Возвращаемое значение из функции потока.
  • Выходное значение процесса потока.
3 голосов
/ 18 августа 2011

Проблема большинства программистов в том, что они не обращают внимания на предупреждения компилятора.На уровне 4 (/ W4) компилятор выдает следующее предупреждение при возвращении -1 из функции, возвращающей DWORD:

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

1 голос
/ 27 февраля 2013

Вы можете использовать концепции потоков в 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
}
1 голос
/ 18 августа 2011

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

...