2011-07-13 48 views
2

在for循环中有一个CreateThread()调用,并且我希望所有线程一个接一个地启动,并且每个线程都将数据写入一个对象。如何在不等待C++响应的情况下启动线程?

 `$while (ii != mapOServs.end()) 
{ 
     Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL); 
    } 

但是,线程只有等到WaitForMultipleObjects或WaitForSingleObject时才会启动。

如何使所有线程一个接一个地运行而不等待响应?

此外,什么是最好的对象使用,以便它可以在不同的线程同时修改。

回答

7

线程确实立即“启动”--- Windows将创建必要的内部结构,分配堆栈等,并将它们添加到调度程序的运行列表中。但是,他们不一定是立即预定

特别是,执行启动的线程可能会继续运行,直到其用完时间片为止。如果你有比处理器内核(包括其他进程中的线程)更多的线程运行,那么你的新线程很可能不会在处理器上安排一段时间,并且执行启动的线程可能会执行最多同步调用,例如WaitForSingleObject他们中的任何一个都有机会做任何工作。

4

线程实际上都立即开始。只要您正确地同步访问该结构,就可以从线程写入任何数据结构。

+1

它们开始,但实际上可能不会在CreateThread函数之后开始直接运行,因为任务调度程序可以让主线程保持运行并且只在一段时间后运行线程。 – Vitor

2

似乎在调试时卡住了。当您逐步执行CreateThread时,它可能不会立即创建并运行线程,因为您在处调试。请记住,在积极调试代码的同时,只允许一个线程运行,其他所有线程保持暂停状态。当你点击F10或F11时,调试器会给出调试对象来运行,这最终会要求OS运行进程/线程来执行。我可以补充更多,但你的问题需要更多的澄清。

+0

你说得对,我被困在调试中。我想知道为什么其他线程在我调试一个线程时没有运行并显示它们的消息。 – roymustang86

相关问题