Как получить результат потока в C ++ - PullRequest
0 голосов
/ 06 июня 2019

Я написал функцию, которая выполняет вычисление Фибоначчи. Я хотел запустить и выполнить его с CreateThread в качестве потока. Наконец, я хочу сохранить результат потока (Фибоначчи) и показать его в консоли. В чем проблема с моим кодом? Это не работает должным образом. Он запускает поток, но я не знаю, как мне сохранить результат потока и показать его.

#include <Windows.h>
#include <iostream>

DWORD WINAPI Fibonacci(LPVOID arg_repeat) {
    DWORD dwValue = *(int*)arg_repeat;

    if (dwValue < 3)
        return 1;

    return Fibonacci((int*)dwValue - 1) + Fibonacci((int*)dwValue - 2);
}

auto main(int argc, const char* argv[]) -> decltype(0) {
    DWORD dwFibonacciValue;
    std::cout << "Fibonacci Value: ";
    std::cin >> dwFibonacciValue;

    DWORD dwThreadId;
    HANDLE hThreading = CreateThread(NULL, 0, Fibonacci, &dwFibonacciValue, NULL, &dwThreadId);
    WaitForSingleObject(hThreading, INFINITE);

    std::cout << "Fibonacci Result: " << dwResult << std::endl;
    CloseHandle(hThreading);

    return 0;
}

1 Ответ

2 голосов
/ 06 июня 2019

Ваш код неверен, потому что (int*)dwValue - 1 не является допустимым указателем.

Вы должны отделить функцию потока от функции Фибоначчи.Будет намного меньше сомнительных и неправильных приведений, и код будет намного яснее:

#include <Windows.h>
#include <iostream>

// Clean and easy to read fibonacci function without fancy casts
DWORD Fibonacci(DWORD dwValue) {
  if (dwValue < 3)
    return 1;

  return Fibonacci(dwValue - 1) + Fibonacci(dwValue - 2);
}

// Thread function
DWORD WINAPI Thread(LPVOID arg_repeat) {
  return Fibonacci(*(DWORD*)arg_repeat);  // the only cast int the whole code
}

int main(int argc, const char* argv[]) -> decltype(0) {
  // it's 'int main', not 'auto main'
  DWORD dwFibonacciValue;
  std::cout << "Fibonacci Value: ";
  std::cin >> dwFibonacciValue;

  DWORD dwThreadId;
  HANDLE hThreading = CreateThread(NULL, 0, Thread, &dwFibonacciValue, 0, &dwThreadId);
  WaitForSingleObject(hThreading, INFINITE);

  // get return value of the thread (your actual question)
  DWORD dwResult;
  GetExitCodeThread(hThreading, &dwResult);

  std::cout << "Fibonacci Result: " << dwResult << std::endl;
  CloseHandle(hThreading);
  return 0;
}

Для ясности в этом коде нет проверки ошибок.

Другие детали:

CreateThread(NULL, 0, Thread, &dwFibonacciValue, NULL, &dwThreadId);   
//                                               ^ you should provide a DWORD
//                                                 here and not a pointer

должно быть

CreateThread(NULL, 0, Thread, &dwFibonacciValue, 0, &dwThreadId);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...