c++ - Windows 上的线程

标签 c++ windows multithreading process

我有一个关于 Windows 线程的小问题。我有以下代码:

主要.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 类的 Mthread.cpp。

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 时,它似乎在工作,但当我不这样做时,什么也没有写。

最佳答案

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

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

关于c++ - Windows 上的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387824/

相关文章:

windows - 启动进程时 "print"和 "printo"动词有什么区别?

c++ - 奇怪的循环缓冲区行为

c++ - 如何检查 z3::expr 是否被赋值

c++ - 尝试从点 unsigned char 获取数据时出现段错误

windows - 为什么 %TEMP% 解析为 %TEMP\<digit> 形式的非确定性路径?

Windows Azure 运行一次例程

Python 相当于 Java 的 `tryLock`(惯用语)?

python - 你如何终止/中断/中止 Python 控制台/sys.stdin readline()?

c++ - 包装类的内存开销

c++ - Qt资源文件利用