C++ Windows上的线程

C++ Windows上的线程,c++,windows,multithreading,process,C++,Windows,Multithreading,Process,我有一个关于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_ba

我有一个关于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);
}
代码正在运行,但我有一个小问题:终端上没有写字符串。 但是,如果我将代码更改为:

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);
    }
}
boolmthread::initThread(std::list*list,DWORD ID)
{
此->保存=列表;
此->线程=CreateThread(NULL,0,(LPTHREAD\u START\u例程)Mthread::ThreadFunc,(LPVOID)列表,0,&ID);
如果(此->线程==NULL)
{

std::cout简短回答:我猜您的main()在线程有机会运行之前终止。添加sleep()或类似于main的东西

更复杂的答案: -线程和主线程彼此独立运行。您必须在主线程中等待,直到您知道可以退出主线程。
-您的程序往往是不安全的,因为所有线程都在不进行任何同步的情况下访问向量。请阅读锁、互斥锁和信号量!

简短回答:我猜您的main()在线程有机会运行之前终止。请添加sleep()或类似于main的内容

更复杂的答案: -线程和主线程彼此独立运行。您必须在主线程中等待,直到您知道可以退出主线程。
-您的程序往往是不安全的,因为所有线程都在不进行任何同步的情况下访问向量。读取锁、互斥锁和信号量!

在终止之前,您的程序应该等待线程完成其工作。在windows上,请查看。

在终止之前,您的程序应该等待线程完成其工作在windows上,看一看。

你期望发生什么?你的std::list/stack的目的是什么?你所说的“cout上的一个小写入”是什么意思?在我添加了
Sleep(4)之后;
,只有一个
是启动
是写入,而不是5。你知道一个函数正在等待线程的结束执行吗?你期望发生什么?你的std::list/stack的目的是什么?你说的“cout上的小写入”是什么意思?好吧,在我添加了
Sleep(4)之后;
,只有一个
是启动
是写入,而不是5。你知道一个函数正在等待线程的结束执行吗?是的,我知道向量。我在解决问题后会锁定它,因为我需要处理它。我更新我的问题。我在主线程上添加
WaitForInput
。但它总是不起作用…不要使用
WaitForInputIdle
。有关正确的函数系列,请参见Shawnone的答案使用。是的,我知道向量。我在解决问题后会锁定它,因为我需要使用它。我更新我的问题。我在我的main上添加
WaitForInputIdle
。但它总是不起作用…不要使用
WaitForInputIdle
。有关要使用的正确函数族,请参阅Shawnone的答案。
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);
    }
}