如何在不等待C ++响应的情况下启动线程?

时间:2011-07-13 21:44:14

标签: c++ windows multithreading visual-c++ handle

在for循环中有一个CreateThread()调用,我希望所有的线程一个接一个地启动,每个线程都将数据写入一个对象。

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

但是线程在遇到WaitForMultipleObjects或WaitForSingleObject之前不会启动。

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

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

3 个答案:

答案 0 :(得分:7)

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

特别是,执行启动的线程可能会一直运行,直到它耗尽了时间片。如果您运行的线程数多于处理器核心(包括其他进程中的线程),那么您的新线程可能暂时不会在处理器上进行调度,并且执行启动的线程可能会执行同步调用,例如{{ 1}}在任何人有机会做任何工作之前。

答案 1 :(得分:4)

线程确实都是立即启动的。只要您正确地同步对该结构的访问,您就可以从线程写入任何数据结构。

答案 2 :(得分:2)

看起来你在调试时卡住了。当您转发CreateThread时,它可能不会立即创建并运行该线程,因为您在此处调试。 请记住,在主动调试代码时,只允许一个线程运行,所有其他线程保持挂起状态。当你点击F10或F11时,调试器会让调试对象运行,最终要求操作系统运行进程/线程来执行。我可能会添加更多内容,但您的问题需要进一步澄清。