Тема о Windows - PullRequest
       6

Тема о Windows

0 голосов
/ 05 декабря 2011

У меня небольшой вопрос по поводу потоков в Windows. У меня есть следующий код:

main.cpp

int     main(int ac, char **av)
{
  std::vector<Mthread *>    mythread;
  std::list<std::string>    stack;
  DWORD     id = 0;

  stack.push_back("Maison");
  stack.push_back("Femmes");
  stack.push_back("Fetes");
  stack.push_back("Voitures");
  stack.push_back("Nounours");
  while (id != 5)
  {
      mythread.push_back(new Mthread());
      mythread[mythread.size() - 1]->initThread(&stack, id);
      id++;
  }
  id = 0;
  while (id != 5)
  {
      WaitForInputIdle(mythread[id]->getThread(), INFINITE);
      id++;
  }
  return (1);
}

и Mthread.cpp, который создает мой Mthread класс.

Mthread::Mthread() {}

Mthread::~Mthread() {}

HANDLE      Mthread::getThread(void) const
{
    return (this->thread);
}

bool        Mthread::initThread(std::list<std::string> *list, DWORD ID)
{
    this->save = list;
    this->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Mthread::ThreadFunc, (LPVOID)list, 0, &ID);
    if (this->thread == NULL)
    {
        std::cout << "Erreur lors du lancement du thread" << std::endl;
        return (false);
    }
    else
    {
        return (true);
    }
}

void        Mthread::ThreadFunc(LPVOID list)
{
        std::cout << " is launch" << std::endl;
}

Код работает, но у меня небольшая проблема: на терминале не написано ни одной строки. Но если я изменю свой код на:

bool        Mthread::initThread(std::list<std::string> *list, DWORD ID)
{
    this->save = list;
    this->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Mthread::ThreadFunc, (LPVOID)list, 0, &ID);
    if (this->thread == NULL)
    {
        std::cout << "Erreur lors du lancement du thread" << std::endl;
        return (false);
    }
    else
    {
        std::cout << "OK" << std::endl;
        return (true);
    }
}

Хорошо "OK" и "is launch" написано 5 раз на терминале. Я не понимаю почему. Когда я передаю небольшую строку a на cout, она, кажется, работает, но когда я ничего не делаю, ничего не пишется.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

краткий ответ: я полагаю, что ваш main () завершает работу, прежде чем потоки смогут запустить. добавьте sleep () или что-то похожее на main.

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

1 голос
/ 05 декабря 2011

Перед завершением ваша программа должна подождать, пока потоки не завершат свою работу. В Windows посмотрите на WaitForMultipleObjects .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...