gpt4 book ai didi

c - 在 C 中使用 win32 在父线程中创建未知数量的子线程?

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:11 26 4
gpt4 key购买 nike

如何使用 C 中的 win32 在父线程中创建未知数量的子线程并一个接一个地等待它们?
父线程的生命周期是无限的,它正在等待请求,如果收到任何请求,则为该请求创建一个新的子线程,例如像服务器。
我正在网上搜索,但我找不到任何东西。
任何教程和信息表示赞赏。
非常感谢,祝你好运。

注意:

1 。例如,想象一个简单的服务器:当用户向该服务器发送请求时,服务器会为该用户创建一个新线程并等待该线程终止,但如果另一个用户发送另一个请求,服务器会创建另一个线程,该线程与旧线程,然后服务器必须等待与旧线程分离的新线程终止。

2。主线程在无限循环中扫描一个大小为常量 n 的全局数组,如果在每个数组 block 中找到特定值,则运行新线程对该 block 的信息进行一些操作,然后在线程终止后更新它 block 的信息。父线程的生命周期是无限的,因为它有一个无限循环。

最佳答案

您将使用 CreateThread 创建每个线程,并将线程句柄存储在动态列表或数组中。如果您希望主线程识别线程何时终止,则可以调用 WaitForMultipleObjects,为其提供一个包含所有线程句柄的数组。 WaitForMultipleObjects 的返回值将告诉您哪个线程句柄收到了信号,因此哪个线程终止了。不要忘记 CloseHandle 最后的线程句柄。

如果您只想生成线程并且主线程不需要知道线程何时终止,那么您可以使用 CreateThread 创建线程并关闭线程句柄。当线程终止时,线程的资源将被释放。

在您的主线程中,您还需要检查您是否收到了客户端请求。如果您有一个可以等待事件的客户端接口(interface),则只需将事件添加到传递给 WaitForMultipleObjects 的事件数组中。如果您没有像案例 2 中那样的事件,那么您可以考虑使用超时调用 WaitForMultipleObjects,以便 WaitForMultipleObjects 在线程终止或超时发生时返回。在这两种情况下,您的主循环都会继续运行,您可以检查是否需要生成另一个线程。

这是为客户端请求使用事件时的一些伪代码:

initialize empty list of thread data (thread handles and other data for each thread);
for(;;) {
create an array a big enough for the request event and for all thread handles;
a[0] = request event handle;
a[1..n] = thread handles from the list;
DWORD ret = WaitForMultiObjects(n+1, a, FALSE, INFINITE);
if(ret == WAIT_OBJECT_0) {
create thread and store it's handle and other data in the list;
}
else if(WAIT_OBJECT_0 + 1 <= ret && ret <= WAIT_OBJECT_0 + n) {
thread (ret - WAIT_OBJECT_0 - 1) terminated, do your cleanup and don't forget CloseHandle();
}
else
error occured, should not happen;
}

如果您没有客户端请求的事件,那么您需要轮询:

initialize empty list of thread data (thread handles and other data for each thread);
for(;;) {
create an array a big enough for the request event and for all thread handles;
a[0..n-1] = thread handles from the list;
DWORD ret = WaitForMultiObjects(n, a, FALSE, your desired timeout);
if(ret != WAIT_TIMEOUT)
; // timeout occured, no thread terminated yet, nothing to do here
else if(WAIT_OBJECT_0 <= ret && ret < WAIT_OBJECT_0 + n) {
thread (ret - WAIT_OBJECT_0) terminated, do your cleanup and don't forget CloseHandle();
}
else
error occured, should not happen;
// Always check for client requests, not only in case of WAIT_TIMEOUT.
// Otherwise you might run into the situation that every time you call WaitForMultiObjects a thread ended just before the timeout occured and you only recognize it after a lot of loop runs when the last thread terminated.
if(there is a client request) {
create thread and store it's handle and other data in the list;
}
}

如果您不需要为每个线程存储额外的数据,那么您可以只存储线程句柄并且可能已经将它们存储在一个大数组中。因此,您可以消除从线程句柄列表构建数组的步骤。

关于c - 在 C 中使用 win32 在父线程中创建未知数量的子线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16078673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com