【发布时间】:2018-03-06 04:00:35
【问题描述】:
PS:我对线程很陌生。
我有一个问题,我需要等待来自客户端的连接请求(完全任意次数),接受套接字上的连接,连接后创建一个工作线程。创建的线程然后创建一个 char 数组,对其进行处理并需要将其传递给父进程。
我已经能够像这样在 while 循环中创建线程
while ((new_socket = accept(srv_sock, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
{
puts("\nConnection accepted");
_beginthreadex(0, 0, handle_client, &new_socket, 0, 0);
}
我已经看到pthread_join() 可用于将数据从线程传递到父进程(在 unix 中)。我的问题是,如何将它集成到主流程中的循环中。
我预计以下方法会导致客户端和服务器之间一次只能建立一个连接的情况,这是不希望的。
while ((new_socket = accept(srv_sock, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
{
puts("\nConnection accepted");
_beginthreadex(0, 0, handle_client, &new_socket, 0, 0);
pthread_join(thread_id,&my_array);
}
编辑:我很高兴知道我想要的是否是不可能的,或者是否有 pthread_join(). 或其 Windows 等效项的替代品。
编辑:我知道pthread_join() 是用于 Unix 并且已经读到 WaitForMultipleObjects() 是它的 windows 等价物。无论如何,我仍然无法找到解决方案。
【问题讨论】:
-
我猜,“Windows”的做法是在 IOCP 完成端口上等待客户端连接接受(重叠的 AcceptEx)和来自客户端线程的排队消息,( PostQueuedCompletionStatus)。或者,在不同的线程中运行 Accept() 循环,并将所有内容排队到您的“主线程”,(或任何将管理这一切的线程),在生产者-消费者队列(可能是 PostMessage、GetMessage)上。
-
TBH,'join()' 在所有情况下都有点像 PITA,如果可以的话,你应该尽量避免它。如果您可以设计为不必等待线程完成,那么您将更轻松地进行多线程编程并避免很多痛苦。任何依赖计算线程数的设计也是如此 - 设计无所谓,避免麻烦。
标签: c windows multithreading winsock waitformultipleobjects