C++ Windows上的线程
我有一个关于Windows线程的小问题。我有以下代码: main.cppC++ 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
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);
}
}