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

Posted

技术标签:

【中文标题】如何在不等待 C++ 响应的情况下启动线程?【英文标题】:How to launch a thread without waiting for response in C++? 【发布时间】:2011-07-13 21:44:14 【问题描述】:

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

      `$while (ii != mapOServs.end())

      Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL);
    

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

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

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

【问题讨论】:

【参考方案1】:

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

特别是,执行启动的线程可能会继续运行,直到它用完它的时间片。如果您运行的线程多于处理器内核(包括其他进程中的线程),那么您的新线程很可能暂时不会在处理器上调度,并且执行启动的线程可能会执行到诸如 @987654321 之类的同步调用@ 在他们有机会做任何工作之前。

【讨论】:

【参考方案2】:

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

【讨论】:

它们会启动,但实际上可能不会在 CreateThread 函数之后直接开始运行,因为任务调度程序可以保持主线程运行,并且只在一段时间后运行线程。【参考方案3】:

您在调试时似乎卡住了。当您跳过CreateThread 时,它可能不会立即创建和运行线程,因为此时您正在调试。 请记住,在主动调试代码时,只允许运行一个线程,所有其他线程保持挂起。当您按下 F10 或 F11 时,调试器让 debuggee 运行,最终要求操作系统运行进程/线程来执行。我可能会补充更多,但您的问题需要更多澄清。

【讨论】:

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

以上是关于如何在不等待 C++ 响应的情况下启动线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不冻结整个线程的情况下让函数等待

如何在不阻塞主线程的情况下使用 join() 创建多个 C++ 线程?

如何在不等待 pthread_barrier_wait() 的情况下执行 pthread_barrier_destroy()

如何在不使用 sleep() 的情况下暂停 DispatchQueue 内的程序执行

如何在不冻结线程的情况下延迟答案? [复制]

如何在不使用跟踪句柄的情况下等待未知数量的 Rust 线​​程完成?