我有一个关于 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/